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 は常に false であるように見えるので、テキストボックスでキーを押しても何が欠けていますか?

4

2 に答える 2

0

MSDNをチェックしてください

「Handled の概念」セクション、特に、handledEventsToo の部分に注意してください。

于 2010-11-30T16:22:26.947 に答える
0

e.Handled = Trueイベントが処理されたことをプログラムに伝え、そのイベントに登録されている他の関数の実行を停止するように設定します。

たとえば、2 つのメソッドを KeyPressed イベントに接続し、最初のメソッドが を設定e.Handled = Trueした場合、2 番目のイベントは実行されません。

UnhandledKeyPressedEvent がイベント シーケンスの最後に来て、他の KeyPressed イベントe.Handled = Trueが UnhandledKeyPressedEvent の実行を防ぐように設定されていることを確認するだけで十分だと思います。

于 2010-11-30T16:11:14.133 に答える