2009-09-25 7 views
8

Ich versuche Befehle basierend auf Tastenanschlägen in Silverlight auszulösen. Wie ich es verstehe, können Sie AccessKey oder AcceleratorKey nicht in Silverlight verwenden. Es sieht auch so aus, als ob die angehängte Eigenschaft InputBindings auch nicht funktioniert.Hotkey-Befehle für Silverlight in MVVM?

Ich begann an anderen Orten zu suchen. Es sah so aus, als ob Prism die Art war, Befehle in Silverlight arbeiten zu lassen, also überprüfte ich das. Sie haben jedoch nur einen Click-Handler, der nicht einmal ein nützlicher Ausgangspunkt für die Einrichtung von Schlüsselbefehlen ist.

Vermisse ich gerade einen Teil von Prism? Oder gibt es eine gute Standardmethode zum Behandeln von Hotkeys mit MVVM Silverlight?

+0

Ich bin sehr gespannt, ob es eine Antwort darauf gibt. – Jeremiah

Antwort

9

Es klingt wie Sie für eine "codeless" MVVMish Art der Handhabung der KeyUp/KeyPress/KeyDown-Ereignis suchen.

Option # 1: Prisma.
Sie haben es nur Schiffe mit dem Click-Befehl erwähnt. Sie können jedoch eigene angehängte DPs hinzufügen, um Befehle für jedes beliebige Ereignis zu aktivieren (wie KeyUp/KeyDown/KeyPress).

Wenn Sie nach einem Beispiel suchen, hat Corey eine gute ToggleButton.Checked/Ungeprüfte Ereignisse.
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" 
     /> 

Auch Erik Mork hat ein exzellentes Video, das Ihnen einen guten Überblick über Befehle und zum Erstellen eines benutzerdefinierten Befehls Befestigt DP gibt. http://development-guides.silverbaylabs.org/Video/Prism-Commands

Option # 2: Mischung Trigger
Die Expression Blend SDK wird mit Trigger und Verhaltensweisen, die vor Ort sind auf dem, was Sie versuchen zu tun.
Blend Examples Codeplex-Projekt wird mit einem Eventtrigger können Sie verwenden:

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

Oder Sie Ihre eigenen Auslöser für Key Schlaganfall Ereignisse schaffen könnte und es tun, was Sie möchten. Hier ist ein Beispiel:
http://azurecoding.net/blogs/brownie/archive/2009/04/06/blend-behaviors-ftw.aspx

+0

Ich zweitens Justins Antwort sehe. Ich habe einen KeyDown/KeyUp Befehl Anhang mit Option # 2 erstellt und ich handle mit PageUp/PageDown und anderen Hotkeys in meiner SL App. Es funktioniert wirklich gut. Ich gebe den Schlüsselcode über den Befehlsparameter ein, so dass mein Befehl die Schlüsselcodes korrekt verarbeiten kann. Es ist eine gute Idee, eine Masse dieser angehängten Befehle zu erstellen. Sie sind einfach zu schreiben und einfach überall zu verwenden, wo Sie sie brauchen. –

+0

Wie bei Option # 1: Das Prism-Modell eignet sich gut für Ereignisse, die keine zusätzlichen Informationen benötigen, sondern bricht zusammen, wenn Sie Variationen desselben Ereignisses haben möchten, z. B. verschiedene Schlüssel in KeyDown. Seine Implementierung beruht auf nur einer angefügten Eigenschaft pro Element, aber für die Behandlung von Hotkeys werden mehrere angefügte Eigenschaften für dasselbe Element benötigt. Die Implementierung des angefügten Eigenschaftsverhaltens lässt dies nicht zu. Option # 2/Brian: Im Idealfall möchten Sie die Hotkeys nicht in der Befehlsimplementierung, sondern in der Ansicht angeben. – RandomEngy

+0

Ich mag diese Mischung Verhalten Probe. Das ist ein kluger Kerl dort;) –

0

Meinst du wie Strg + v oder so Ich habe das folgende Beispiel an der MSDN site gesehen.

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

Ich suche nach einem MVVM-Befehlsmuster. Ich weiß bereits, wie man es im Codebehind anschließen kann. – RandomEngy

0

Die MVVM toolkit enthält eine interessante CommandReference Klasse, die Sie Inputbindings zu Viewmodel-Befehle binden können. Ich bin mir nicht sicher, dass es für Silverlight funktioniert, aber man kann es versuchen ...

OK, wie RandomEngy darauf hingewiesen, es gibt keine Inputbindings in Silverlight ...

Aber ich denke, Sie könnte angehängtes Verhalten verwenden. Es ist eine Möglichkeit, ein Ereignis an einen Befehl des ViewModel zu "binden". Marlon Grech hat a good implementation here

+1

Ich glaube nicht, dass Silverlight InputBindings hat. – RandomEngy

+1

Sie haben absolut Recht, ich hatte dieses Detail vergessen ...Ich bin immer erstaunt, wenn ich die Einschränkungen von Silverlight im Vergleich zu WPF –