2009-07-20 5 views
0

Cela ressemble à une question délicate ... laissez-moi ellaborate ...Dans WPF, lorsque je sélectionne un TreeViewItem, comment puis-je me concentrer sur un autre contrôle tout en complétant ma sélection TreeViewItem?

J'ai un treeView. Quand un treeViewItem est cliqué/sélectionné, je voudrais qu'un autre TextBox soit focalisé. Le problème est que dès que j'ajoute du code à Focus the Textbox, il semble que TreeView ne montre plus son nœud sélectionné (c'est-à-dire que le treeItem n'est pas sélectionné du tout (ou du moins pas visiblement)).

Voici mon code de gestion ... événement

private void trvTree_SelectedItemChanged(object sender, RoutedPropertyChangedEventArgs<object> e) 
    { 
     grpEditTreeItem.DataContext = (TreeItemDefinition)e.NewValue; 


     txtToken.SelectAll(); 
     txtToken.Focus(); 
    } 

Toutes les idées?

+0

S'il vous plaît fournir plus de détails ... –

Répondre

1

Distinguer entre sélectionné et ciblé. Vous ne pouvez pas avoir plus d'un contrôle à la fois.

Ce que vous voulez est votre TreeView à Afficher il est selectednode quand il a perdu le focus.

Editer:
Mais je peux confirmer le problème, en réglant le focus à un autre contrôle à l'intérieur de SelectedItemChanged() annulera la sélection.

Vous avez donc besoin de quelque chose pour reporter l'appel Focus(). Une solution approximative (mais pas idéale) consiste à placer txtToken.Focus() dans un gestionnaire d'événements trvTree_MouseUp(). Mais cela enlèvera également le focus lors de l'expansion d'un nœud par exemple. Par conséquent, vous devrez probablement utiliser un temporisateur One-shot tiré de SelectedItemChanged().

+0

Bon point, je vais préciser ... – willem

+0

Vous pouvez également la file d'attente de l'appel de mise au point sur le répartiteur. Je l'utilise presque par défaut de nos jours, de cette façon il n'interfère pas avec le cadre d'exécution actuel, et il semble que 90% du temps il fasse ce que vous voulez dans une situation donnée – flq

0
this.Dispatcher.BeginInvoke((Action)delegate 
{ 
    txtToken.SelectAll(); 
    txtToken.Focus(); 
}); 
Questions connexes