3

当我的 TreeView 中的节点有多行时,TreeView 项目符号会垂直居中。

如何顶部对齐 TreeView 项目符号?

替代文字 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>
4

1 回答 1

2

好问题...当然,可以通过重新定义模板来完成,但这很痛苦...(如果您想这样做,请使用 StyleSnooper 或 ShowMeTheTemplate 提取模板并更改VerticalAlignmentToggleButton

另一种方法是继承TreeViewItem和覆盖该OnApply方法。由于ToggleButton默认模板中有一个名称(“Expander”),您可以找到它并应用VerticalAlignment您想要的:

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生成TopAlignedTreeViewItems 而不是TreeViewItems,您还需要自己制作TreeView

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

    protected override System.Windows.DependencyObject GetContainerForItemOverride()
    {
        return new TopAlignedTreeViewItem();
    }
}
于 2010-06-02T12:43:18.237 回答