2010-07-04 3 views
0

J'ai mis un Expander sur une page. Dans l'expander il y a un label. Une fois la page chargée, l'extension n'est pas encore développée. À ce stade, je l'expandeur à l'aide inspecte VisualTreeHelper, je suis une structure comme ceci:Comment rendre le contenu de Expander visible à VisualTreeHelper

Expander 
    Border 
     DockPanel 
     ToggleButton 
      Border 
      Grid 
       Ellipse 
       Ellipse 
       Path 
       ContentPresenter 
     ContentPresenter 

où il n'y a pas d'étiquette sous la dernière ContentPresenter.

Cependant, une fois l'extension est étendu puis effondré, je suis arrivé à la structure différente en utilisant VisualTreeHelper:

Cette fois, l'étiquette apparaît sous le ContentPresenter.

Il semble que tant que l'extension a été étendue, VisualTreeHelper connaîtra le contenu dans l'Expander. Mais est-il possible de faire en sorte que VisualTreeHelper soit conscient du contenu d'Expander sans l'étendre?

Merci.

Répondre

4

Il existe une méthode pour forcer un contrôle à charger son contenu par programme.

J'imagine que vous avez une sorte de boucle récursive qui cherche dans vos éléments. Avant d'appeler pour obtenir ses enfants, utilisez cet appel:

if (element is FrameworkElement) 
    (element as FrameworkElement).ApplyTemplate() 

Ça va le forcer à appliquer son modèle et charger les contrôles dans la mémoire. J'imagine que c'est fait de cette façon pour des raisons de performances, car les contrôles ne sont normalement pas nécessaires tant qu'ils ne sont pas visibles.

Cette approche fonctionne également pour TabControl et tout autre contrôle qui peut cacher le contenu, je crois.

Le mérite revient à Tao Liang qui a posté cette solution sur here. Lisez-le également si vous rencontrez des problèmes avec votre boucle récursive.

Questions connexes