次のイベントを使用することができるが、それらは、各要素のために添付する必要があります。キーボードフォーカスイベントをグローバルに検出することはできますか?
GotKeyboardFocus、LostKeyboardFocus
は、集束要素が変更された場合に検出グローバルに.NET WPFでの方法はありますか?すべての可能な要素のイベントリスナーを追加する必要はありませんか?
次のイベントを使用することができるが、それらは、各要素のために添付する必要があります。キーボードフォーカスイベントをグローバルに検出することはできますか?
GotKeyboardFocus、LostKeyboardFocus
は、集束要素が変更された場合に検出グローバルに.NET WPFでの方法はありますか?すべての可能な要素のイベントリスナーを追加する必要はありませんか?
あなたは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
イベントをサブスクライブ:
メインウィンドウにルーテッドイベントハンドラを追加して、処理したいイベントを指定できます。
mainWindow.AddHandler(
UIElement.GotKeyboardFocusEvent,
OnElementGotKeyboardFocus,
true
);
完璧に作業しました!どうもありがとう! – Alexey
あなたはこれで任意のクラスでこれを行うことができます:フォーカスの変更はとき
//In the constructor
EventManager.RegisterClassHandler(
typeof(UIElement),
Keyboard.PreviewGotKeyboardFocusEvent,
(KeyboardFocusChangedEventHandler)OnPreviewGotKeyboardFocus);
...
private void OnPreviewGotKeyboardFocus(object sender,
KeyboardFocusChangedEventArgs e)
{
// Your code here
}
はどのようにマイクロソフトのトリガCommandManager.RequerySuggested
イベントを見てください。
簡単な例:
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;
}
}
これはまた、マルチウィンドウアプリケーションで動作します。
この方法のように、プレビューイベントであるために誤った結果を招く可能性があるため、実際にフォーカスの変更が行われない可能性があります。これは、ウィンドウとソース要素の間のUIElementがイベントを処理済みとしてマークした場合に発生します。 – Hank
私は@ハンクに同意します。 PreviewXxxは、実際に変更されることを保証するものではありません。 Vaccanoの答えは実際には正しいものです。 Nicolasには代替品もありますが、それは全く同じではありません。処理されたイベントのフォールスルーのおかげでチェーンの全員に通知が届きます。 – MarqueIV