0

我不知道这是否是一种好的工作方式,但我需要处理我的 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 总是错误的,所以即使我在文本框中按下一个键,我还缺少什么?

4

2 回答 2

0

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

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

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

于 2010-11-30T16:11:14.133 回答
0

查看MSDN

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

于 2010-11-30T16:22:26.947 回答