2012-04-24 17 views
10

Los siguientes eventos pueden ser utilizados, pero, que debe ser fijación para cada elemento:¿Es posible detectar eventos de enfoque de teclado globalmente?

GotKeyboardFocus, LostKeyboardFocus

¿Hay alguna manera en .NET WPF globalmente detectar si el elemento enfocado cambiado? sin tener que agregar detectores de eventos para todos los elementos posibles?

Respuesta

3

Usted puede conectar a los eventos de vista previa 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"> 
.... 

De esta manera, como se muestra arriba, la ventana se notificaría antes de que todos los descendientes cuando cualquiera de los descendientes obtiene o pierde el foco del teclado.

Lea this para obtener más información.

+1

Parece que este método podría generar resultados incorrectos debido a que es un evento de vista previa y, por lo tanto, es posible que el cambio de enfoque no se realice realmente. Esto ocurriría si un UIElement entre la ventana y el elemento de origen marcara el evento como manejado. – Hank

+0

Estoy de acuerdo con @Hank. PreviewXxx no garantiza que realmente cambie. La respuesta de Vaccano es realmente la correcta. Nicolas también tiene una alternativa, aunque no es lo mismo, ya que todos los integrantes de la cadena son notificados gracias al fracaso en los eventos manejados. – MarqueIV

5

Puede agregar un controlador de eventos enrutados a su ventana principal y especificar que le interesan los eventos administrados.

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

¡Funcionó a la perfección! ¡Muchas gracias! – Alexey

12

Usted puede hacer esto en cualquier clase con esto:

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

...

private void OnPreviewGotKeyboardFocus(object sender, 
             KeyboardFocusChangedEventArgs e) 
{ 

    // Your code here 

} 
0

Tener un vistazo a cómo Microsoft gatillo CommandManager.RequerySuggested evento cuando cambia el enfoque: se suscriban a InputManager.PostProcessInput evento.

ReferenceSource

ejemplo simple:

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

Esto también funciona en aplicaciones multi-ventana.

Cuestiones relacionadas