2009-09-08 9 views
5

Je souhaite que le gestionnaire PreviewTextInput crée un nouveau contrôle et que le focus soit défini. Mais même après avoir appelé Focus() sur le nouveau contrôle, le curseur est toujours dans l'ancienne zone de texte. Le gestionnaire UserControl_PreviewTextInput est enregistré sur UserControl qui contient cette zone de texte si cela est important.WPF: Impossible de définir le focus

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

CodeLineControl est défini comme (simplifié):

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

Y at-il des limites à mise au point() qui ne Iam Awre au sujet? Ne suis-je pas autorisé à déplacer Focus() loin d'un TextBox à partir d'un gestionnaire PreviewTextInput? Je ne peux pas mettre l'accent sur les éléments nouvellement créés?

Répondre

3

Créer un DispatcherTimer qui appelle se concentrer sur cette zone de texte après un délai

+0

Pourquoi cela est-il nécessaire? J'ai ajouté le nouveau contrôle à l'interface graphique afin qu'il soit visible et focalisable. – codymanix

+0

Je pense qu'il est rendu de manière asynchrone dans un thread séparé et vous ne pouvez pas vous concentrer dessus tant que cela n'est pas terminé. Ou, il se peut que, après l'ajout d'un nouveau contrôle, WPF change le focus lui-même. Peut-être que l'événement LostFocus est viré à un moment donné? Vous pouvez écrire un fichier journal pour voir quels contrôles obtiennent/perdent le focus. http://www.julmar.com/blog/mark/PermaLink,guid,6e4769e5-a0b3-47b2-a142-6dfefd0c028e.aspx –

18

Ceci est la méthode d'extension que j'utilise pour au lieu de mise au point:

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

Pas besoin de créer une minuterie.

+2

excellente solution! +1 – Dabblernl

+0

Je vole votre codez! Je renomme ['FocusLikeChuckNorris'] (http://www.chucknorrisfacts.com)! (+1) –

Questions connexes