2010-06-02 4 views
3

내 TreeView의 노드에 여러 줄이있는 경우 TreeView 글 머리 기호가 세로 가운데에 배치됩니다.XAML TreeView HierarchicalDataTemplate에서 글 머리 기호를 세로로 맞추려면 어떻게해야합니까?

어떻게 TreeView 글 머리 기호를 정렬 할 수 있습니까?

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> 

답변

2

좋은 질문입니다 ... 물론, 그것은 템플릿을 다시 정의하여 수행 할 수 있지만, 그것은 (당신이 그 길을 갈하려는 경우에 템플릿을 추출 ... 고통이다 StyleSnooper 또는 ShowMeTheTemplate과 ToggleButton)

또 다른 방법의 VerticalAlignment 변경은 TreeViewItem을 상속하고 OnApply 메소드를 오버라이드 (override)하는 것입니다. ToggleButton 기본 템플릿에 이름 ("확장기")를 가지고 있기 때문에, 당신은 그것을 발견하고는 VerticalAlignment 당신이 원하는 적용 할 수있는 다음 TreeViewTopAlignedTreeViewItem의 대신 TreeViewItem의를 생성하기 위해

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; 
      } 
     } 
    } 
} 

, 당신은 또한 필요 나만의 것 만들기 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

Template.FindName을 사용하려면 코드에서 무엇을 참조해야합니까? –

+0

아무것도 템플릿은 현재 인스턴스 (this.Template)의 속성입니다 –

+0

'System.Windows.Controls.ControlTemplate'에 'FindName'에 대한 정의가없고 확장 메서드가없는 'FindName'이 첫 번째로 허용됩니다 'System.Windows.Controls.ControlTemplate'형식의 인수를 찾을 수 있습니다 (지시문이나 어셈블리 참조가 누락 되었습니까?) –

관련 문제