0

Comment obtenir le panneau utilisé dans un TreeView? J'ai lu que par défaut TreeView utilise un VirtualizingStackPanel pour cela. Quand je regarde un modèle TreeView, tout ce que je vois est < ItemsPresenter/>, qui semble cacher les détails de ce panneau est utilisé.Comment obtenir le panneau dans une arborescence (WPF)

solutions possibles:

1) Sur l'instance TreeView ("TV"), à partir du code, faites ceci: tv.ItemsPanel.

Le problème est que ceci ne renvoie pas un panneau, mais un ItemsPanelTemplate ("obtient ou définit le modèle qui définit le panneau qui contrôle la disposition des éléments").

2) Créez un modèle TreeView qui remplace explicitement < ItemsPresenter/> avec votre propre ItemsControl.ItemsPanel. Je fournis un modèle spécial de toute façon, donc c'est bien dans mon scénario. Donnez ensuite un nom de pièce au panneau que vous placez dans ce modèle, et à partir du code, vous pouvez obtenir cette pièce (c'est-à-dire le panneau). Le problème avec ça? voir ci-dessous.

(J'utilise un contrôle nommé VirtualTreeview qui est dérivé de TreeView, comme on le voit ci-dessous):

<ControlTemplate x:Key="VirtualTreeViewTemplate" TargetType="{x:Type local:VirtualTreeView}"> 
    <Border> 
     <local:VirtualScrollViewer 
      Style="{StaticResource VirtualScrollViewer}" 
      x:Name="PART_VirtualScrollViewer" 
        CanContentScroll="True"> 
       <!-- instead of: <ItemsPresenter />, use following: --> 
       <ItemsControl> 
        <ItemsControl.ItemsPanel> 
         <ItemsPanelTemplate> 
          <StackPanel 
          Name="PART_ItemsStackPanel" 
          IsItemsHost="True" /> 
         </ItemsPanelTemplate> 
        </ItemsControl.ItemsPanel> 
       </ItemsControl> 
     </local:VirtualScrollViewer> 
    </Border> 
</ControlTemplate> 

[Je dépouillé tout encombrement ici pour une meilleure visibilité ...]

Le problème avec ceci: ceci surpasse immédiatement tout mécanisme de mise en page TreeView. En fait, vous obtenez simplement un écran vide, même lorsque TreeViewItems remplit l'arborescence. Eh bien, la raison pour laquelle je veux obtenir le panneau est de prendre partie dans le MeaureOverride, mais sans entrer dans tout cela, je ne veux certainement pas réécrire le livre de la façon de mettre en forme un treeview. C'est-à-dire, en faisant cela, l'étape n ° 2 semble invalider le point même d'utiliser un TreeView en premier lieu. Désolé, s'il ya une certaine confusion ici, merci pour toute aide que vous pouvez offrir.

Répondre

0

Il existe une classe appelée VisualTreeHelper qui vous permet d'obtenir des contrôles enfant/éléments non exposés d'un contrôle.

Voici un lien vers la méthode GetChild sur cette classe qui vous permet d'énumérer tous les enfants, etc:

http://msdn.microsoft.com/en-us/library/system.windows.media.visualtreehelper.getchild.aspx

+0

Cela fait ce que j'ai demandé directement, merci beaucoup. Malheureusement, la plus grande chose que je suis après n'est pas résolu par ceci, qui est, j'essaye alors d'utiliser MeasureOverride sur ce panneau. Je pense que je vais devoir dériver un panneau pour remplacer une méthode cependant. Et cela, malheureusement, m'amène à l'étape # 2, où TreeView ne semble pas faire de rendu du tout seul (écran vide). Merci encore. J'ai retravaillé le code que vous avez donné et je cherche un moyen de le publier, ce qui peut être utile aux autres. –

0

Ce qui suit est un complément à la réponse donnée par David ci-dessus. Cela offre un moyen d'obtenir tous les enfants Visual UIElement via une méthode d'extension.

public static class WPFXtensions 
{ 
    static public IEnumerable<UIElement> GetDescendantUIElements(this UIElement uiElement) 
    { 
     int childrenCnt = VisualTreeHelper.GetChildrenCount(uiElement); 
     for (int i = 0; i < childrenCnt; i++) 
     { 
      Visual childVisual = VisualTreeHelper.GetChild(uiElement, i) as Visual; 

      if(childVisual == null) 
       continue; 

      if (childVisual is UIElement) 
      { 
       yield return childVisual as UIElement; 

       // note: by recursively calling within the loop, we walk the tree all the way down for each 
       // UIElement encountered before moving to the next UIElement sibling. 
       foreach (UIElement e in GetDescendantUIElements(childVisual as UIElement)) 
        yield return e; 
      } 
     } 
    } 
} 

// Use this then like this to retrieve an expected child StackPanel 

StackPanel sp1 = (StackPanel)this.GetDescendantUIElements() 
      .First(uiElem => uiElem is StackPanel); 

// Get all of this UIElement's descendants (for a diagnostic look); 
// In a run where this was a TreeView, 78 UIElements returned 

List<UIElement> uiElements = this.GetDescendantUIElements().ToList(); 
Questions connexes