2010-10-29 5 views
3

Compte tenu d'un déjà chargé et rendu TabControl avec trois onglets, avec onglet sélectionné index étant 1 (le milieu):Comment accéder nouvel arbre visuel lorsque WPF TabControl selectedItem change

Tab 1: Y a un TextBox

Tab 2: A deux TextBoxes

Tab 3: A trois zones de texte

Si j'itérer arbre visuel avec VisualTreeHelper du selectedItem, je vais obtenir deux zones de texte au sein des enfants du tabcontrol.

Je souhaite répéter l'opération lorsque la sélection d'onglet change et accède aux commandes du nouvel onglet. Si je passe à l'index de tabulation 2, je devrais trouver trois zones de texte en utilisant VisualTreeHelper.

La solution normale serait de s'abonner à l'événement modifié de sélection et de parcourir l'arborescence pour récupérer les contrôles nouvellement affichés. Le problème est qu'en ce moment, l'arbre visuel a toujours l'ancien onglet, rendant cette recherche inutile.

Comment puis-je intercepter le moment où le nouveau TabItem est affiché et déclencher ma recherche?

Je crée un moteur de validation dynamique qui surveille tous les contrôles d'entrée d'une interface utilisateur donnée, même quand il change soit par des changements de modèle ContentControl, soit par des changements d'onglet TabControl ... J'espère que vous obtenez l'image.

Des idées? Le TabControl charge/décharge ses éléments lorsque vous changez d'onglet, vous devriez donc être en mesure d'attacher votre validation sur l'événement Loaded de TabItem

+0

Avez-vous trouvé une solution? Je suis confronté exactement au même problème - j'ai besoin d'itérer les contrôles de la nouvelle Tab, mais VisualTreeHelper montre les anciens contrôles Tab dans le gestionnaire d'événements SelectionChanged. – digitguy

Répondre

0

+0

Etes-vous sûr que TabControl charge/décharge ses éléments afin que l'événement Unloaded des anciens TabItem et l'événement Loaded du nouveau TabItem soient déclenchés? J'ai essayé ceci, mais l'événement Loaded/Unloaded n'a jamais été déclenché lors de la modification des onglets. – digitguy

+0

@digitguy Est-ce que tous vos 'TabItems' partagent le même' ItemTemplate'? Si c'est le cas, il réutilisera le modèle existant au lieu de le décharger et de le recharger. – Rachel

+0

Je n'utilise aucun ItemTemplate. J'ai un TabControl simple ayant deux TabItems, chacun ayant son propre StackPanel avec deux TextBoxes dedans. – digitguy

1

Une solution consiste à retarder l'accès jusqu'à ce que l'onglet est entièrement chargé à l'aide Dispatcher.BeginInvoke:

private void TabControlSelectionChanged(object sender, SelectionChangedEventArgs e) 
{ 
    this.Dispatcher.BeginInvoke(DispatcherPriority.Loaded, 
           (Action)(() => 
           { 
            // access the new tab's visual tree here 
           })); 
} 

aide DispatcherPriority.Loaded signifie que le nouvel onglet devra se charger avant que l'arbre visuel est accessible.