MVVM Обрабатывать все необработанные нажатия клавиш в ViewModel
Я не знаю, является ли это хорошим способом для работы, но мне нужно обрабатывать все необработанные нажатия клавиш на моей ViewModel, поэтому моя идея заключалась в том, чтобы использовать поведение в моем ShellView, которое бы передавало все необработанные нажатия клавиш на ViewModel..
Но проблема в том, как получить все необработанные нажатия клавиш?
Вот моя первая попытка просто поймать их
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
Но кажется, что e.Handled всегда ложно, так что я пропускаю, даже если я нажимаю клавишу в текстовом поле?
2 ответа
Ты устанавливаешь e.Handled = True
сообщить программе, что событие обработано, и прекратить выполнение любых других функций, зарегистрированных для этого события.
Например, если вы подключаете два метода к событию KeyPressed, а первый устанавливает e.Handled = True
тогда второе событие никогда не будет выполнено.
Я предполагаю, что все, что вам действительно нужно сделать, это убедиться, что ваш UnhandledKeyPressedEvent стоит последним в последовательности событий, и что любые другие события KeyPressed установлены e.Handled = True
чтобы предотвратить выполнение UnhandledKeyPressedEvent.
Проверьте MSDN
Обратите внимание на раздел "Концепция обработанного", особенно на часть handledEventsToo.