WPF TreeView的列标题

Nar*_*esh 9 wpf treeview columnheader

我使用WPF TreeView来显示一些分层信息.TreeView中的每个项目都包含多个属性,因此我在HierarchicalDataTemplate中使用Grid来显示这些属性:

<HierarchicalDataTemplate x:Key="ArtistTemplate"
    ItemsSource="{Binding XPath=Title}"
    ItemTemplate="{StaticResource TitleTemplate}">

    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition SharedSizeGroup="NameColumn" />
            <ColumnDefinition SharedSizeGroup="GenreColumn" />
            <ColumnDefinition SharedSizeGroup="BornColumn" />
            <ColumnDefinition SharedSizeGroup="DiedColumn" />
        </Grid.ColumnDefinitions>

        <TextBlock Grid.Column="0" Text="{Binding XPath=@Name}" />
        <TextBlock Grid.Column="1" Text="{Binding XPath=@Genre}" />
        <TextBlock Grid.Column="2" Text="{Binding XPath=@Born}" />
        <TextBlock Grid.Column="3" Text="{Binding XPath=@Died}" />
    </Grid>

</HierarchicalDataTemplate>
Run Code Online (Sandbox Code Playgroud)

这显示为一个漂亮的TreeView有4列 - 到目前为止一切都很好!我需要的唯一额外的东西是TreeView上方的标题,显示列名称.标题列宽度应与TreeViewItems同步,标题样式也应该是可自定义的.最简单的方法是什么?

PS我找到了两个接近的解决方案:

1)这里有一个TreeListView ,但这需要我为我的模型实现一个自定义接口(ITreeModel).此解决方案中的方法是从ListView开始并手动实现RowExpander.在我的情况下,TreeView足够接近我需要的,所以我希望在它上面放一个标题应该非常简单.

2)这里有一个TreeListView .这个确实以TreeView开头,但我无法弄清楚如何自定义标头.我怀疑我必须在generic.xaml中自定义GridViewHeaderRowPresenter,但是这个元素似乎没有自己的ControlTemplate.

小智 0

您可以尝试重用 SharedSizeGroup 定义。例如,在 TreeView 上方放置另一个网格作为标题,并将它们放置在堆栈面板中,如下所示:

        <StackPanel Grid.IsSharedSizeScope="True" Orientation="Vertical">
            <Grid>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition SharedSizeGroup="NameColumn" />
                    <ColumnDefinition SharedSizeGroup="GenreColumn" />
                    <ColumnDefinition SharedSizeGroup="BornColumn" />
                    <ColumnDefinition SharedSizeGroup="DiedColumn" />
                </Grid.ColumnDefinitions>
                <TextBlock Grid.Column="0" Text="Name"/>
                <TextBlock Grid.Column="1" Text="Genre"/>
                <TextBlock Grid.Column="2" Text="Born"/>
                <TextBlock Grid.Column="3" Text="Dies"/>
            </Grid>
            <TreeView>
               ...
            </TreeView>
        </StackPanel>

Run Code Online (Sandbox Code Playgroud)

Grid.IsSharedSizeScope =True将重用您的标题和树的 SharedSizeGroups。

您还可以单独设置标题的样式。