2009-09-08 16 views
5

Quiero que desde el controlador PreviewTextInput se cree un nuevo control y se establezca el foco en él. Pero incluso después de llamar a Focus() en el nuevo control, el cursor aún está en el antiguo cuadro de texto. El controlador UserControl_PreviewTextInput está registrado en el UserControl que contiene este cuadro de texto, si esto es importante.WPF: No se puede establecer el foco

private void UserControl_PreviewTextInput(object sender, TextCompositionEventArgs e) 
{ 
      CodeLineControl el = new CodeLineControl(); 
      container.Children.Insert(idx+1, el); 
      el.innerTextBox.Focus(); 
} 

CodeLineControl se define como que (simplificado):

<UserControl ..> 
    <DockPanel Name="codeline" Background="AntiqueWhite" >   
     <TextBox Name="innerTextBox"/>  
    </DockPanel> 
</UserControl> 

¿Hay algunas limitaciones en Focus() que Iam no AWRE acerca? ¿No puedo mover Focus() lejos de un TextBox desde un controlador PreviewTextInput? ¿No puedo establecer el foco en los elementos recién creados?

Respuesta

3

Crear un DispatcherTimer que llama a centrarse en ese cuadro de texto después de un retraso

+0

¿Por qué es necesario? Agregué el nuevo control a la interfaz gráfica de modo que debería ser visible y enfocable. – codymanix

+0

Creo que se procesa de forma asíncrona en un hilo separado y no puede enfocarse en él hasta que esté completo. O bien, es posible que después de agregar un nuevo control, WPF cambie el enfoque en sí mismo. Quizás el evento LostFocus se disparó en algún momento? Podría escribir un archivo de registro para ver qué controles obtienen/pierden el foco. http://www.julmar.com/blog/mark/PermaLink,guid,6e4769e5-a0b3-47b2-a142-6dfefd0c028e.aspx –

18

Este es el método de extensión que utilizo para en su lugar de trabajo:

public static void BackgroundFocus(this UIElement el) 
    { 
     Action a =() => el.Focus(); 
     el.Dispatcher.BeginInvoke(DispatcherPriority.Background, a); 
    } 

No hay necesidad de crear un temporizador.

+2

¡gran solución! +1 – Dabblernl

+0

¡Le robo su codez! Cambio el nombre a ['FocusLikeChuckNorris'] (http://www.chucknorrisfacts.com)! (+1) –

Cuestiones relacionadas