MVVM处理ViewModel上所有未处理的击键

时间:2010-11-30 15:37:54

标签: wpf vb.net mvvm keystrokes

我不知道这是否是一种好的工作方式,但我需要处理我的ViewModel上所有未处理的击键,所以我的想法是在我的ShellView上使用一个行为,将所有未处理的击键转发给ViewModel .. < / p>

但问题是我如何得到所有未处理的按键?

这是我第一次尝试抓住他们

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 个答案:

答案 0 :(得分:0)

您设置e.Handled = True告诉程序事件已被处理,并停止执行注册到该事件的任何其他功能。

例如,如果您将两个方法连接到KeyPressed事件,并且第一个设置e.Handled = True,那么第二个事件将永远不会被执行。

我猜你真正需要做的就是确保你的UnhandledKeyPressedEvent在事件序列中排在最后,并且任何其他KeyPressed事件都设置为e.Handled = True以阻止UnhandledKeyPressedEvent执行。

答案 1 :(得分:0)

查看MSDN

注意“处理的概念”部分,尤其是processedEventsToo部分。