2009-09-25 12 views
8

Próbuję wywoływać polecenia oparte na naciśnięciach klawiszy w Silverlight. Jak rozumiem, nie można używać AccessKey lub AcceleratorKey w Silverlight. Wygląda na to, że może być przydatna dołączona właściwość InputBindings również nie działa.Polecenia klawiszy dla Silverlight w MVVM?

Zacząłem szukać w innych miejscach. Wyglądało na to, że Prism był sposobem na uzyskanie poleceń działających w Silverlight, więc to sprawdziłem. Jednak mają one jedynie moduł obsługi kliknięć, który nie jest nawet przydatnym punktem początkowym do ustawiania poleceń klawiszy.

Czy brakuje mi jakiejś części pryzmatu? Czy istnieje dobry standardowy sposób obsługi skrótów klawiszowych za pomocą MVVM Silverlight?

+0

Jestem bardzo ciekawy, czy istnieje na to odpowiedź. – Jeremiah

Odpowiedz

9

Wygląda na to, że szukasz "bezkodowego" sposobu MVVMish na obsługę zdarzenia KeyUp/KeyPress/KeyDown.

Opcja nr 1: Pryzmat.
Wspomniałeś o tym tylko wysyłając za pomocą polecenia Kliknij. Możesz jednak dodać własne dołączone DP, aby włączyć polecenia dla dowolnego zdarzenia, które chcesz (np. KeyUp/KeyDown/KeyPress).

Jeśli szukasz próbki na Corey ma dobry dla ToggleButton.Checked/Unchecked wydarzeń.
http://www.85turns.com/2009/06/24/togglebutton-command-for-prism/

<ToggleButton x:Name="ToggleButton1" 
      customCommands:Checked.Command="{Binding CheckedCommand}" 
      customCommands:UnChecked.Command="{Binding UnCheckedCommand}" 
     Margin="8,8,0,8" Content="Check me" 
     /> 

Również Erik Mork ma doskonały film, który daje dobry przegląd poleceń i jak tworzyć niestandardowe polecenie Załączone DP. http://development-guides.silverbaylabs.org/Video/Prism-Commands

Wariant nr 2: Mieszanka Wyzwala
The Expression Blend SDK statków z wyzwalaczy i zachowań, które są na miejscu do czego staramy się robić.
Blend Examples Codeplex statki projekt o EventTrigger można użyć:

<i:EventTrigger EventName="Click"> 
     <si:InvokeDataCommand Command="{Binding ShoppingCart.CheckOutCommand}"/> 
</i:EventTrigger> 

Albo, można stworzyć swój własny spust do kluczowych wydarzeń z udarem i zrobić tam cokolwiek chcesz. Oto przykład:
http://azurecoding.net/blogs/brownie/archive/2009/04/06/blend-behaviors-ftw.aspx

+0

I sekundę odpowiedzi Justina. Stworzyłem załącznik poleceń KeyDown/KeyUp przy użyciu opcji nr 2 i obsługuję PageUp/PageDown i inne klawisze skrótu w mojej aplikacji SL. Działa bardzo dobrze. Przepuszczam kod klawisza za pomocą parametru komendy, więc moje polecenie może obsłużyć odpowiednie kody kluczy. Dobrym pomysłem jest utworzenie masy tych dołączonych poleceń. Są proste w pisaniu i łatwe w użyciu w dowolnym miejscu. –

+0

Podobnie jak w przypadku opcji nr 1: model Prism działa dobrze w przypadku zdarzeń, które nie wymagają dodatkowych informacji, ale ulegają awarii, jeśli użytkownik chce mieć warianty tego samego zdarzenia, takie jak różne klucze na kluczu. Jego implementacja opiera się tylko na jednej dołączonej właściwości na element, ale do obsługi skrótów klawiszowych będziesz chciał wielu dołączonych właściwości na tym samym elemencie. Załączona implementacja zachowania właściwości nie pozwala na to. Opcja # 2/Brian: Czy nie chciałbyś, aby klawisze skrótów były określone w widoku, a nie w implementacji polecenia? – RandomEngy

+0

Bardzo podoba mi się ta próbka zachowania mieszanki. To jeden sprytny gość;) –

0

Czy chodzi ci o Ctrl + v lub takie Widziałem następujący przykład na MSDN site.

void Canvas_KeyUp(object sender, KeyEventArgs e) 
{ 
    //check for the specific 'v' key, then check modifiers 
    if (e.Key==Key.V) { 
     if ((Keyboard.Modifiers & ModifierKeys.Control) == ModifierKeys.Control) { 
     //specific Ctrl+V action here 
     } 
    } // else ignore the keystroke 
} 
+0

Szukam wzorca polecenia MVVM. Już wiem, jak to podłączyć w kodzie źródłowym. – RandomEngy

0

MVVM toolkit zawiera ciekawą CommandReference klasy, który pozwala powiązać InputBindings do poleceń ViewModel. Nie jestem pewien, że pracuje dla Silverlight, ale można spróbować ...

OK, jak RandomEngy podkreślił, nie ma InputBindings w Silverlight ...

Myślę jednak, że ci może użyć przywiązanych zachowań. Jest to sposób na "powiązanie" zdarzenia z poleceniem ViewModel. Marlon Grech ma a good implementation here

+1

Nie wierzę, że Silverlight ma InputBindings. – RandomEngy

+1

Masz całkowitą rację, zapomniałem o tym szczególe ...Zawsze jestem zdumiony, gdy widzę ograniczenia Silverlight w porównaniu z WPF –

Powiązane problemy