2012-04-24 4 views
10

次のイベントを使用することができるが、それらは、各要素のために添付する必要があります。キーボードフォーカスイベントをグローバルに検出することはできますか?

GotKeyboardFocus、LostKeyboardFocus

は、集束要素が変更された場合に検出グローバルに.NET WPFでの方法はありますか?すべての可能な要素のイベントリスナーを追加する必要はありませんか?

答えて

3

あなたはtunnelingプレビューイベントにフックすることができます。子孫のいずれかを取得またはキーボードフォーカスを失ったとき

<Window x:Class="WpfApplication1.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Height="350" Width="525" 
    PreviewGotKeyboardFocus="Window_PreviewGotKeyboardFocus" 
    PreviewLostKeyboardFocus="Window_PreviewLostKeyboardFocus"> 
.... 

この方法では、上記のように、窓はすべての子孫の前に通知されることでしょう。

詳細については、thisをお読みください。彼らはInputManager.PostProcessInputイベントをサブスクライブ:

+1

この方法のように、プレビューイベントであるために誤った結果を招く可能性があるため、実際にフォーカスの変更が行われない可能性があります。これは、ウィンドウとソース要素の間のUIElementがイベントを処理済みとしてマークした場合に発生します。 – Hank

+0

私は@ハンクに同意します。 PreviewXxxは、実際に変更されることを保証するものではありません。 Vaccanoの答えは実際には正しいものです。 Nicolasには代替品もありますが、それは全く同じではありません。処理されたイベントのフォールスルーのおかげでチェーンの全員に通知が届きます。 – MarqueIV

5

メインウィンドウにルーテッドイベントハンドラを追加して、処理したいイベントを指定できます。

mainWindow.AddHandler(
    UIElement.GotKeyboardFocusEvent, 
    OnElementGotKeyboardFocus, 
    true 
); 
+0

完璧に作業しました!どうもありがとう! – Alexey

12

あなたはこれで任意のクラスでこれを行うことができます:フォーカスの変更はとき

//In the constructor 
EventManager.RegisterClassHandler(
     typeof(UIElement), 
     Keyboard.PreviewGotKeyboardFocusEvent, 
     (KeyboardFocusChangedEventHandler)OnPreviewGotKeyboardFocus); 

...

private void OnPreviewGotKeyboardFocus(object sender, 
             KeyboardFocusChangedEventArgs e) 
{ 

    // Your code here 

} 
0

はどのようにマイクロソフトのトリガCommandManager.RequerySuggestedイベントを見てください。

ReferenceSource

簡単な例:

static KeyboardControl() 
{ 
    InputManager.Current.PostProcessInput += InputManager_PostProcessInput; 
} 

static void InputManager_PostProcessInput(object sender, ProcessInputEventArgs e) 
{ 
    if (e.StagingItem.Input.RoutedEvent == Keyboard.GotKeyboardFocusEvent || 
     e.StagingItem.Input.RoutedEvent == Keyboard.LostKeyboardFocusEvent) 
    { 
     KeyboardFocusChangedEventArgs focusArgs = (KeyboardFocusChangedEventArgs)e.StagingItem.Input; 
     KeyboardControl.IsOpen = focusArgs.NewFocus is TextBoxBase; 
    } 
} 

これはまた、マルチウィンドウアプリケーションで動作します。

関連する問題