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私は近い2つの解決策を見つけました:

1)ここに TreeListView がありますが、これにはモデルにカスタム インターフェイス (ITreeModel) を実装する必要があります。また、このソリューションのアプローチは、ListView から開始し、RowExpander を手動で実装することです。私の場合、TreeView は必要なものに十分近いので、ヘッダーを簡単に配置できることを願っています。

2)ここに TreeListView 。これは確かに TreeView から始まりますが、ヘッダーをカスタマイズする方法がわかりません。generic.xaml の GridViewHeaderRowPresenter をカスタマイズする必要があると思いますが、この要素には独自の ControlTemplate がないようです。

4

1 に答える 1

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>

Grid.IsSharedSizeScope =Trueは、ヘッダーとツリーに SharedSizeGroups を再利用します。

ヘッダーを個別にスタイルすることもできます。

于 2021-12-13T12:20:58.743 に答える