2010-10-19 18 views
5

Tengo un control de pestañas y algunos elementos de pestañas. Estoy escuchando con éxito el evento SelectionChanged y comprobando si la pestaña que me interesa es la seleccionada actualmente.WPF TabControl En SelectionChanged, establezca el foco en un campo de texto

Estoy usando este código (debajo), y al pasar por el depurador, puedo ver que mi lógica de ramificación funciona como está diseñada; sin embargo, el problema que estoy teniendo es que algo está anulando esta llamada al txt.Focus() porque después de que se muestra el elemento de la pestaña correcta, el foco no está en el cuadro de texto.

private void tabMain_SelectionChanged(object sender, SelectionChangedEventArgs e) 
{ 
    // exact same behavior with and without this line 
    e.Handled = true; 

    if (e.AddedItems.Contains(usrTab)) 
    { 
     txtusr.Focus(); 
    } 
    else if (e.AddedItems.Contains(svcTab)) 
    { 
     txtsvc.Focus(); 
    } 
} 

Si acabo de poner txtusr.Focus() en un controlador de eventos de botón, se centra exactamente como yo esperaría.

Sospecho que esto tiene que ver con el contenido de tabitem que no se carga en el momento en que se llama al método .Focus(), pero no estoy seguro de cómo solucionarlo.

+0

¿Ha aislado el problema externo a su código para ver si es reproducible? Si es así, es un problema de tiempo/marco y luego puedes abordar el problema de forma un poco diferente con ese conocimiento en la mano. –

+0

Pude reproducir inconsistentemente esto en un programa auxiliar. – Nate

Respuesta

10

Intenta poner las llamadas .Focus() dentro de un dispatcher.BeginInvoke.

Dispatcher.BeginInvoke(new Action(() => { txtsvc.Focus(); })); 
+0

No obtuve una excepción de subprocesamiento, pero esto solucionó el problema. Gracias. – Nate

+2

Yah, en este caso no se trata realmente de hilos. Algunos controles usan Dispatcher.Invoke/BeginInvoke internamente. Al agregar su tarea al final de la cola de Dispatcher, permite que todo termine antes de que finalice (siempre que su tarea sea de igual o menor prioridad que todo lo demás). Esa es mi comprensión al menos. – mdm20

Cuestiones relacionadas