【问题标题】:Styling the WPF TreeView样式化 WPF TreeView
【发布时间】:2013-11-25 21:06:55
【问题描述】:

我想使用以下规则为 WPF 树视图制作样式:

  • 必须在样式中定义树的外观;
  • 必须在样式中定义树项的外观;
  • 必须在样式中定义树项内容(标题)的外观,并且可以在样式之外自定义选项。

我提取了TreeViewTreeItem 的默认样式并做了一些修改。目前,我的代码骨架如下所示:

<Window.Resources>
    <Style TargetType="{x:Type TreeView}">
        <Style.Resources>
            <Style TargetType="{x:Type TreeViewItem}">
            ...
            </Style>
        </Style.Resources>
    </Style>
</Window.Resources>

<Grid>
    <TreeView>
        <TreeViewItem Header="Root">
            <TreeViewItem header="Inner" />
        </TreeViewItem>
    </TreeView>
</Grid>

我已经自定义了展开按钮的外观,以检查是否一切正常。上面显示的代码按计划工作。

但是我想自定义样式之外的TreeViewItems 的外观。我写:

<TreeView>
    <TreeView.Resources>
        <Style TargetType="{x:Type TreeViewItem}">
            <Setter Property="HeaderTemplate">
                <Setter.Value>
                    ...
                </Setter.Value>
            </Setter>
        </Style>
    </TreeView.Resources>

    <TreeViewItem Header="Root">
        <TreeViewItem Header="Sub" />
    </TreeViewItem>
</TreeView>

项目的样式是我想要的,但是扩展器按钮会返回到它的默认外观。

如何实现我想要的样式机制?

您可以下载whole sample source

【问题讨论】:

    标签: c# wpf treeview


    【解决方案1】:

    如果我对您的理解正确,您想创建一个 基于默认StyleStyle。如果这是正确的,那么您可以使用 Style.BasedOn 属性,前提是您为默认的 Style 提供 x:Key 值:

    <Window.Resources>
        <Style x:Key="DefaultTreeViewStyle" TargetType="{x:Type TreeView}">
            <Style.Resources>
                <Style TargetType="{x:Type TreeViewItem}">
                ...
                </Style>
            </Style.Resources>
        </Style>
    </Window.Resources>
    

    然后,您可以将 覆盖 Style 建立在默认的基础上,如下所示:

    <TreeView.Resources>
        <Style TargetType="{x:Type TreeViewItem}" 
            BasedOn="{StaticResource DefaultTreeViewStyle}">
            <Setter Property="HeaderTemplate">
                <Setter.Value>
                    ...
                </Setter.Value>
            </Setter>
        </Style>
    </TreeView.Resources>
    

    新的Style 将包含默认Style 的所有设置以及您在此处提供的任何其他设置。

    实际上,再想一想,我认为您可以将 覆盖 Style 基于默认值,而无需像这样在默认值上设置 x:Key 值:

    <TreeView.Resources>
        <Style TargetType="{x:Type TreeViewItem}" 
            BasedOn="{StaticResource {x:Type TreeViewItem}}">
            <Setter Property="HeaderTemplate">
                <Setter.Value>
                    ...
                </Setter.Value>
            </Setter>
        </Style>
    </TreeView.Resources>
    

    【讨论】:

    • 它似乎有效。但是有没有办法在不使用 BasedOn 的情况下达到相同的结果?如果需要,我也可以修改 TreeView 的样式。我也可以基于TreeView 创建自定义控件,但我不确定这是否有帮助。
    • 我想说的是,如果你使用TreeViewTreeViewItem 的默认样式,你不必使用BasedOn 来自定义样式项。我想以这种方式将样式应用于TreeView,这也是可能的。
    • 不幸的是,BasedOn自定义 现有的 Styles 一样好。
    猜你喜欢
    • 1970-01-01
    • 2015-06-16
    • 1970-01-01
    • 2020-12-15
    • 2012-04-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多