【问题标题】:How can I vertically align the bullet in a XAML TreeView HierarchicalDataTemplate?如何在 XAML TreeView HierarchicalDataTemplate 中垂直对齐项目符号?
【发布时间】:2010-06-02 12:15:37
【问题描述】:

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

如何使 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>

【问题讨论】:

    标签: wpf silverlight xaml treeview hierarchicaldatatemplate


    【解决方案1】:

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

    另一种方法是继承TreeViewItem 并覆盖OnApply 方法。由于ToggleButton 在默认模板中有一个名称(“扩展器”),您可以找到它并应用您想要的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();
        }
    }
    

    【讨论】:

    • 我需要在后面的代码中引用什么才能使用 Template.FindName?
    • 没什么,模板是当前实例(this.Template)的一个属性
    • 我得到:“System.Windows.Controls.ControlTemplate”不包含“FindName”的定义,并且没有扩展方法“FindName”接受“System.Windows.Controls”类型的第一个参数.ControlTemplate' 可以找到(您是否缺少 using 指令或程序集引用?)
    • 啊,您一定在使用 Silverlight... Template.FindName 仅在 WPF 中可用。所以我猜你将不得不重新定义模板......
    • 对不起,是的,我正在使用silverlight,好的,我会走那条路
    猜你喜欢
    • 1970-01-01
    • 2019-03-15
    • 1970-01-01
    • 2021-09-14
    • 2020-11-18
    • 2018-07-06
    • 2020-10-04
    • 2019-10-04
    • 2012-10-08
    相关资源
    最近更新 更多