2010-11-30 4 views
0

これはうまく動作するかどうかわかりませんが、私のViewModelのすべての未処理のキーストロークを処理する必要があるので、未処理のキーストロークをViewModelに返します。MVVM 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はいつも、私はテキストボックスでキーを押してもを何をしないのです偽であると思われますか?

+0

他のハンドルでe.HandledをTrueに設定する必要があります。それは自動ではありません。 –

+0

キーがテキストボックスで扱われても? – Peter

答えて

0

このイベントに処理されたことをプログラムに通知し、そのイベントに登録されている他の機能の実行を停止するには、e.Handled = Trueを設定します。

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

UnhandledKeyPressedEventがイベントシーケンスの最後に来るようにし、他のKeyPressedイベントがe.Handled = Trueを設定してUnhandledKeyPressedEventが実行されないようにする必要があると思います。

+0

と私はどのように "あなたのUnhandledKeyPressedEventがイベントシーケンスの最後に来ることを確認する"でしょうか? – Peter

+0

そのイベントを最後に登録する – Rachel

+0

と私はそれをどうやってやりますか?私は "Keyboard.AddGotKeyboardFocusHandler"の後にイベントを接続しようとしましたが、それは助けになりませんでした.. – Peter

0

セクション、特にhandledEventsToo部「取扱のコンセプト」にMSDN

ご注意をご覧ください。

+0

役に立つと思われますが、問題は、テキストボックスを選択してDキーを押してもテキストボックスにdが追加されても、私のイベントはまだ起動します...だから私は何が欠けていますか? – Peter

+0

「e.Handled = true」と言うTextBoxにKeyPressedイベントを追加します。 – Rachel

+0

@Petoj:「処理中」という概念を誤解しているようです。 テキストボックスがキープレスで何をすべきかを知っているからといって、イベントが処理されたとマークされているとは限りません。この例を考えてみましょう。「d」を押すとテキストボックスに文字「D」が表示されないようにします。今、 "d"を押すと、テキストボックスに何も起こりません。キープレスイベントが処理されていないと言うことができますか?いいえ!テキストボックスがイベントを処理しています(文字 "d"を無視します)。 RoutedEventインフラストラクチャでイベントのルーティングを停止したい場合。e.HandledをTrueに設定することで明示的に伝える必要があります。 –

関連する問題