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.

Другие вопросы по тегам