14

次のイベントを使用できますが、要素ごとにアタッチする必要があります。

GotKeyboardFocus、LostKeyboardFocus

.NET WPFに、フォーカスされた要素が変更されたかどうかをグローバルに検出する方法はありますか?考えられるすべての要素のイベントリスナーを追加する必要はありませんか?

4

4 に答える 4

20

これを使用すると、どのクラスでもこれを行うことができます。

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

..。

private void OnPreviewGotKeyboardFocus(object sender, 
                                       KeyboardFocusChangedEventArgs e)
{

     // Your code here

}
于 2013-02-21T21:36:04.757 に答える
6

トンネリングプレビューイベントにフックできます。

<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">
....

このように、上記のように、子孫のいずれかがキーボードフォーカスを取得または失ったときに、すべての子孫の前にウィンドウに通知されます。

詳細については、これをお読みください。

于 2012-04-24T14:35:37.700 に答える
5

ルーティングされたイベントハンドラーをメインウィンドウに追加して、処理されるイベントに関心があることを指定できます。

mainWindow.AddHandler(
    UIElement.GotKeyboardFocusEvent,
    OnElementGotKeyboardFocus,
    true
);
于 2012-04-24T14:32:52.380 に答える
0

CommandManager.RequerySuggestedフォーカスが変更されたときにMicrosoftがイベントをトリガーする方法を見てください。彼らはInputManager.PostProcessInputイベントをサブスクライブします。

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;
    }
}

これは、マルチウィンドウアプリケーションでも機能します。

于 2016-09-01T15:11:42.273 に答える