2012-07-06 60 views
5

Me gustaría tener una propiedad que siempre esté vinculada al control actualmente enfocado.¿Hay alguna forma de vincular Keyboard.FocusedElement?

He visto dos formas de obtener el control actualmente enfocado.

Uno está utilizando Keyboard.FocusedElement. El segundo es atravesar el árbol visual.

Como quiero saber cada vez que el elemento enfocado cambia, el cruce de árbol visual parece que se estaría ejecutando una gran cantidad de código todo el tiempo.

Pero Keyboard.FocusedElement no implementa INotifyPropertyChanged. Entonces no puedo vincularme a él normalmente.

¿Hay alguna manera de hacerlo para avisarme cuando cambie?

(o alguna otra manera de tener una propiedad que siempre se establece en el centrado actualmente el control?)

NOTA: Es evidente que podría añadir un evento en cada control y hacer que actualizar una propiedad . Pero tengo muchos controles. Quiero evitar tener que adjuntar un evento a cada uno de ellos.

Respuesta

6

Se podría tratar de suscribirse a la Keyboard.GotKeyboardFocus Attached Event

Se produce cuando un elemento recibe el foco del teclado.

Aquí es un ejemplo que se suscribe a este evento OnStartup. Puede usar un comportamiento adjunto que hace esto y actualiza una propiedad adjunta a la que puede vincular, por ejemplo.

public partial class App : Application 
{ 
    protected override void OnStartup(StartupEventArgs e) 
    { 
     EventManager.RegisterClassHandler(typeof(UIElement), 
      Keyboard.GotKeyboardFocusEvent, 
      new RoutedEventHandler(Keyboard_GotKeyboardFocus), true); 

     base.OnStartup(e); 
    } 

    private void Keyboard_GotKeyboardFocus(object sender, RoutedEventArgs e) 
    { 
     Debug.WriteLine(e.OriginalSource); 
    } 
} 
+1

¡Esta fue realmente una respuesta fabulosa! Muchas gracias por señalarme esto. – Vaccano

+0

Claro, me alegro de poder ayudar :) –

Cuestiones relacionadas