2010-11-30 12 views
0

Je ne sais pas si c'est une bonne façon de travailler mais j'ai besoin de gérer toutes les frappes non gérées sur mon ViewModel donc mon idée était d'utiliser un comportement sur mon ShellView qui relaie tous touches non gérées à la ViewModel ..MVVM Gérer toutes les frappes non gérées sur ViewModel

Mais le problème est de savoir comment puis-je obtenir toutes les touches non manipulées?

Voici mon premier essai juste les attraper

Public Class ForwardKeyBehavior 
    Inherits Behavior(Of DependencyObject) 

    Protected Overrides Sub OnAttached() 
     Keyboard.AddKeyDownHandler(Me.AssociatedObject, AddressOf OnKeyPressed) 
     Keyboard.AddPreviewKeyDownHandler(Me.AssociatedObject, AddressOf OnPreviewKeyPressed) 
     MyBase.OnAttached() 
    End Sub 

    Protected Overrides Sub OnDetaching() 
     Keyboard.RemoveKeyDownHandler(Me.AssociatedObject, AddressOf OnKeyPressed) 
     MyBase.OnDetaching() 
    End Sub 

    Private Sub OnPreviewKeyPressed(ByVal sender As Object, ByVal e As KeyEventArgs) 

    End Sub 

    Private Sub OnKeyPressed(ByVal sender As Object, ByVal e As KeyEventArgs) 
     If (Not e.Handled) Then 
      Trace.Write(e.Key.ToString()) 
     End If 
    End Sub 

End Class 

Mais il semble que e.Handled est toujours faux si ce que je manque i même si j'appuie sur une touche dans une zone de texte?

+0

Vous devez définir e.Handled sur True dans les autres poignées manuellement. Ce n'est pas automatique. –

+0

Même si la clé est gérée dans une zone de texte? – Peter

Répondre

0

Vous définissez e.Handled = True pour indiquer au programme que l'événement a été géré et pour arrêter l'exécution de toutes les autres fonctions enregistrées pour cet événement. Par exemple, si vous connectez deux méthodes à l'événement KeyPressed et la première e.Handled = True, le 2ème événement ne sera jamais exécuté.

Je suppose que tout ce que vous devez vraiment faire est de vous assurer que votre UnhandledKeyPressedEvent arrive en dernier dans la séquence d'événements, et que tout autre événement KeyPressed défini e.Handled = True pour empêcher l'exécution de UnhandledKeyPressedEvent.

+0

et comment puis-je "assurer que votre UnhandledKeyPressedEvent arrive en dernier dans la séquence d'événements"? – Peter

+0

Inscrivez-vous cet événement en dernier – Rachel

+0

et comment j'irais faire cela? J'ai essayé de brancher l'événement après "Keyboard.AddGotKeyboardFocusHandler" mais cela n'a pas aidé .. – Peter

0

Découvrez MSDN

d'attention à "Le concept de Handled" section, en particulier la partie handledEventsToo.

+0

bien oui semble utile mais le problème est que même si je sélectionne une zone de texte et que j'appuie sur D, le d est ajouté à la zone de texte mais mon événement se déclenche toujours ... alors qu'est-ce qui me manque? – Peter

+0

Ajouter un événement KeyPressed à la TextBox qui dit 'e.Handled = true' – Rachel

+0

@Petoj: Il semble que vous vous méprenez sur le concept de" être manipulé ". Le fait que la zone de texte sache quoi faire avec une touche ne signifie pas que l'événement sera ou devrait être marqué comme étant géré. Pensez à cet exemple: vous voulez une zone de texte pour ne pas afficher la lettre "D" lorsque vous appuyez sur "d". Maintenant, si vous appuyez sur "d", rien ne se passe dans la zone de texte. Pouvez-vous dire maintenant que l'événement de presse clé n'est pas géré? Non! Votre zone de texte gère l'événement (pour ignorer la lettre "d"). Si vous souhaitez que l'infrastructure RoutedEvent arrête le routage d'un événement.Vous devez le dire explicitement en définissant e.Handled sur True. –