2010-06-02 17 views
3

Lorsqu'un nœud de mon TreeView a plusieurs lignes, la puce TreeView est centrée verticalement.Comment est-ce que je peux aligner verticalement la balle dans un TreeArt HierarchicalDataTemplate de XAML?

Comment puis-je aligner la puce TreeView par haut?

alt text http://www.deviantsart.com/upload/1uh2k8p.png

<pages:BasePage.Resources> 
    <data:HierarchicalDataTemplate x:Key="OutlineTemplate" 
     ItemsSource="{Binding OutlineDocumentObjects}"> 
     <TextBlock Text="{Binding Line}" 
      TextWrapping="Wrap" 
      VerticalAlignment="Top" 
      Width="600"/> 
    </data:HierarchicalDataTemplate> 
</pages:BasePage.Resources> 

<StackPanel Style="{StaticResource StackPanelPageWrapperStyle}"> 
    <tk:TreeView x:Name="TheTreeView" 
     ItemsSource="{Binding TheOutline.OutlineDocumentObjects}" 
     ItemTemplate="{StaticResource OutlineTemplate}"> 
    </tk:TreeView> 
</StackPanel> 

Répondre

2

Bonne question ... Bien sûr, il pourrait être fait en redéfinir le modèle, mais il est une douleur ... (si vous voulez aller de cette façon, extraire le modèle avec StyleSnooper ou ShowMeTheTemplate et changer le VerticalAlignment du ToggleButton)

Une autre façon est d'hériter TreeViewItem et remplacer la méthode OnApply. Étant donné que le ToggleButton a un nom (« Expander ») dans le modèle par défaut, vous pouvez trouver et appliquer la VerticalAlignment que vous voulez:

public class TopAlignedTreeViewItem : TreeViewItem 
{ 
    public override void OnApplyTemplate() 
    { 
     base.OnApplyTemplate(); 
     if (Template != null) 
     { 
      ToggleButton btn = Template.FindName("Expander", this) as ToggleButton; 
      if (btn != null) 
      { 
       btn.VerticalAlignment = VerticalAlignment.Top; 
      } 
     } 
    } 
} 

Pour la TreeView pour générer TopAlignedTreeViewItem s au lieu de TreeViewItem s, vous devez également faites votre propre TreeView:

public class TopAlignedTreeView : TreeView 
{ 
    protected override bool IsItemItsOwnContainerOverride(object item) 
    { 
     return (item is TopAlignedTreeViewItem); 
    } 

    protected override System.Windows.DependencyObject GetContainerForItemOverride() 
    { 
     return new TopAlignedTreeViewItem(); 
    } 
} 
+0

Que dois-je faire référence dans mon code pour utiliser Template.FindName? –

+0

rien, Template est une propriété de l'instance actuelle (this.Template) –

+0

J'obtiens: 'System.Windows.Controls.ControlTemplate' ne contient pas de définition pour 'FindName' et aucune méthode d'extension 'FindName' acceptant une première l'argument de type 'System.Windows.Controls.ControlTemplate' peut être trouvé (manque-t-il une directive using ou une référence d'assembly?) –