10

我正在使用 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>

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

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

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

2)这里的 TreeListView 。这确实是从 TreeView 开始的,但我不知道如何自定义标题。我怀疑我必须在generic.xaml中自定义GridViewHeaderRowPresenter,但是这个元素似乎没有自己的ControlTemplate。

4

1 回答 1

0

您可以尝试重用您的 SharedSizeGroup 定义。例如,在 TreeView 上方放置另一个网格作为标题,并将它们放置在 stackpanel 中,例如:

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

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

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

于 2021-12-13T12:20:58.743 回答