C# 样式更改应用于TreeView节点的所有子节点

C# 样式更改应用于TreeView节点的所有子节点,c#,wpf,treeview,C#,Wpf,Treeview,我有一个TreeView,里面有很多项目,显然是以树状结构排列的。我正在尝试以粗体打印父节点,并以普通字体打印其所有子节点。然而,当我这样做时: TreeViewItem item = GetParentNode(...); item.FontWeight = FontWeights.Bold; 这不仅会将父对象的样式更改为粗体,还会将其所有子对象的样式更改为粗体。我一直在TreeView类中寻找禁用此递归更新的属性,但找不到任何属性。如何避免这种行为?设置字体属性时,它会将其应用于所有子项。

我有一个
TreeView
,里面有很多项目,显然是以树状结构排列的。我正在尝试以粗体打印父节点,并以普通字体打印其所有子节点。然而,当我这样做时:

TreeViewItem item = GetParentNode(...);
item.FontWeight = FontWeights.Bold;

这不仅会将父对象的样式更改为粗体,还会将其所有子对象的样式更改为粗体。我一直在
TreeView
类中寻找禁用此递归更新的属性,但找不到任何属性。如何避免这种行为?

设置字体属性时,它会将其应用于所有子项。您可以创建一个新的头模板,并将其仅应用于作为父节点的节点

在我的测试中起作用的另一种方法是设置前景色:

    public MainWindow()
    {
        InitializeComponent();

        StyleParents(MyTreeView.Items);
    }

    private void StyleParents(ItemCollection items)
    {
        foreach (var i in items)
        {
            TreeViewItem tvi = i as TreeViewItem;

            if (tvi != null)
            {
                if (tvi.HasItems)
                {
                    tvi.Foreground = Brushes.Magenta;

                    StyleParents(tvi.Items);
                }
            }                                
        }
    }

我发现在WPF
TreeView
中,如果尚未设置属性,则属性会转移到它们的子级。避免此问题的最简单方法(至少以编程方式)是在创建子节点后立即将其字体设置为默认字体。例如

TreeViewItem item = new TreeViewItem ();
item.FontWeight = FontWeights.Normal;
// ...add item to tree

如果您现在将父节点的
FontWeight
设置为粗体,则子节点将不会更改。

您是否在代码隐藏中执行所有操作?你在XAML中有HierarchycalDataTemplate吗?我在XAML中设计了
TreeView
(虽然代码非常简单,几乎不值得一提),但是设置字体权重必须通过编程完成,因为这是用户交互的一部分。看看这个:它显示了一个类似的问题,用datatriggers解决了。