次のイベントを使用できますが、要素ごとにアタッチする必要があります。
GotKeyboardFocus、LostKeyboardFocus
.NET WPFに、フォーカスされた要素が変更されたかどうかをグローバルに検出する方法はありますか?考えられるすべての要素のイベントリスナーを追加する必要はありませんか?
次のイベントを使用できますが、要素ごとにアタッチする必要があります。
GotKeyboardFocus、LostKeyboardFocus
.NET WPFに、フォーカスされた要素が変更されたかどうかをグローバルに検出する方法はありますか?考えられるすべての要素のイベントリスナーを追加する必要はありませんか?
これを使用すると、どのクラスでもこれを行うことができます。
//In the constructor
EventManager.RegisterClassHandler(
typeof(UIElement),
Keyboard.PreviewGotKeyboardFocusEvent,
(KeyboardFocusChangedEventHandler)OnPreviewGotKeyboardFocus);
..。
private void OnPreviewGotKeyboardFocus(object sender,
KeyboardFocusChangedEventArgs e)
{
// Your code here
}
トンネリングプレビューイベントにフックできます。
<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">
....
このように、上記のように、子孫のいずれかがキーボードフォーカスを取得または失ったときに、すべての子孫の前にウィンドウに通知されます。
詳細については、これをお読みください。
ルーティングされたイベントハンドラーをメインウィンドウに追加して、処理されるイベントに関心があることを指定できます。
mainWindow.AddHandler(
UIElement.GotKeyboardFocusEvent,
OnElementGotKeyboardFocus,
true
);
CommandManager.RequerySuggested
フォーカスが変更されたときにMicrosoftがイベントをトリガーする方法を見てください。彼らはInputManager.PostProcessInput
イベントをサブスクライブします。
簡単な例:
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;
}
}
これは、マルチウィンドウアプリケーションでも機能します。