2012-10-12 150 views
7

Tengo una aplicación que tiene una ventana principal que contiene un montón de cosas. De vez en cuando, el usuario hará algo en respuesta al cual quiero mostrar algo completamente diferente en la ventana principal, ocultando temporalmente lo que está allí.WPF: ¿Cómo configurar el teclado en un control de usuario? (Problemas con KeyBinding)

Estoy haciendo esto haciendo que el elemento más externo en la ventana principal sea una cuadrícula sin filas o columnas definidas. Todos los elementos de la grilla llenarán por completo la única celda de la grilla, dibujando sobre los demás.

Mi montón de cosas normales, entonces, está en el primer elemento de la grilla, y mi algo temporal es un UserControl como el segundo elemento de la grilla, que normalmente está configurado Visibility = Collapsed.

Excepto por KeyBinding todo funciona bien. Cuando se activa el comando apropiado en el grupo regular de cosas, la visibilidad en el UserControl se establece en Visible, y cubre el grupo regular de cosas por completo. Cuando el usuario hace clic en el botón Cerrar en UserControl, su visibilidad se establece en Contraído, nuevamente, y desaparece y se revela el montón de cosas.

Mi problema es con KeyBindings. Tengo algunos definidos en UserControl, que no deberían definirse en la ventana principal, y no funcionan. O más bien, funcionan bien una vez que hago clic dentro de UserControl, pero no funcionan hasta que lo hago.

Necesito que funcionen tan pronto como el UserControl se hace visible, sin que el usuario haga clic o tab en el UserControl propiamente dicho.

Supongo que esto tiene algo que ver con el enfoque del teclado, pero no he podido encontrar la manera de centrarme en UserControl. Aquí está la cosa: el único elemento dentro de UserControl es un control de pestañas, todas las pestañas que se construyen dinámicamente mediante plantillas. No hay elementos conocidos en tiempo de compilación que pueda hacer referencia explícitamente y pasar a KeyBoard.Focus().

Entonces, ¿estoy en lo cierto al pensar que es la falta de enfoque lo que está causando el problema? Y si es así, ¿cómo puedo establecer el foco en un elemento en un TabControl, cuando ni siquiera sé cuántas pestañas hay, y mucho menos cuál es la seleccionada?

+0

por qué no puedes enfocar directamente el control del usuario. Como en, Keyboard.Focus (userControl)? –

+0

Gran pregunta. No funciona Puedo llamar a KeyBoard.Focus() en el control, pero el método GotFocus del control no se activa. –

+1

Pero, si configuro Focusable = "True" en el control, entonces lo hace. Gracias por hacerme mirar en el lugar correcto. –

Respuesta

9

Quería que este control tuviera el foco, cuando se hiciera visible. Entonces, en el constructor, configuré un controlador en IsVisibleChanged.

public MyControl 
{ 
    ... 
    this.IsVisibleChanged += new DependencyPropertyChangedEventHandler(MyControl_IsVisibileChanged); 
} 

void MyControl_IsVisibleChanged(object sender, DependencyPropertyChangedEventArgs e) 
{ 
    if (!(bool(e.NewValue) 
     return; 
    this.Focusable = true; 
    Keyboard.Focus(this); 
} 

que podrían haber establecido enfocable en el XAML, pero yo preferiría que en el código subyacente, por lo que todo el código en cuestión es en un solo lugar.

Cuestiones relacionadas