2010-10-19 4 views
5

J'ai un contrôle Onglet et quelques éléments d'onglets. J'écoute avec succès l'événement SelectionChanged et je vérifie si l'onglet qui m'intéresse est celui actuellement sélectionné. J'utilise ce code (ci-dessous), et en passant par le débogueur, je peux voir que ma logique de branchement fonctionne comme prévu; cependant, le problème que j'ai est que quelque chose est en train de passer outre cet appel à txt.Focus() car après que l'élément d'onglet correct est affiché, le focus n'est pas sur la zone de texte.WPF TabControl Sur SelectionChanged, définissez le focus sur un champ de texte

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 je viens de mettre txtusr.Focus() dans un gestionnaire d'événements de bouton, il se concentre exactement comme je pense.

Je soupçonne que cela a à voir avec le contenu de tabitem ne pas être chargé au moment où la méthode .Focus() est appelée, mais je ne suis pas sûr de savoir comment y remédier.

+0

Avez-vous isolé le problème externe à votre code pour voir s'il est reproductible? Si c'est le cas, il s'agit d'un problème de calendrier/cadre et vous pouvez alors aborder le problème un peu différemment avec cette connaissance en main. –

+0

J'ai été capable de reproduire de façon inconsistante dans un programme de bout. – Nate

Répondre

10

Essayez de placer les appels .Focus() dans un répartiteur.BinInInvoke.

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

Je n'obtenais pas d'exception de thread, mais cela a résolu le problème. Merci. – Nate

+2

Yah, dans ce cas, il ne s'agit pas vraiment de discussions. Certains contrôles utilisent Dispatcher.Invoke/BeginInvoke en interne. En ajoutant votre tâche à la fin de la file d'attente de Dispatcher, vous autorisez tout ce qui précède avant qu'elle ne finisse (tant que votre tâche est de priorité égale ou inférieure à tout le reste). C'est ma compréhension au moins. – mdm20

Questions connexes