改变Treeview WPF中特定元素的颜色

7

我在我的WPF应用程序中有一个TreeView。在运行时,如果树的元素满足某些条件,它应该将其字体颜色从黑色更改为红色。

XAML

<TreeView Grid.Column="0" Grid.Row="0"  HorizontalAlignment="Stretch" Name="treeView1" 
                      VerticalAlignment="Stretch"
                      SelectedItemChanged="treeView1_SelectedItemChanged" HorizontalContentAlignment="Stretch" 
                      VerticalContentAlignment="Top" BorderThickness="0,0,0,1" BorderBrush="LightGray">

    <TreeViewItem Header="Head Tree" ItemsSource="{Binding MainComps}">
        <TreeViewItem.ItemContainerStyle>
            <Style TargetType="{x:Type TreeViewItem}">
                <Setter Property="IsExpanded" Value="{Binding IsExpanded, Mode=TwoWay}" />
            <Setter Property="IsSelected" Value="{Binding IsSelected, Mode=TwoWay}" />
            <Setter Property="FontWeight" Value="Normal" />

            <Style.Triggers>
                <Trigger Property="IsSelected" Value="True">
                    <Setter Property="FontWeight" Value="Bold" />
                </Trigger>

                <DataTrigger Binding="{Binding IsSelected}" Value="True">
                        <Setter Property="Foreground" Value="RED" />
                </DataTrigger>
            </Style.Triggers>                                 
        </Style>
    </TreeViewItem.ItemContainerStyle>

    <TreeViewItem.Resources>
        <HierarchicalDataTemplate  DataType="{x:Type TextBlock}" ItemsSource="{Binding Children}">
            <StackPanel Orientation="Horizontal">
                <TextBlock Text="Head Tree" />
            </StackPanel>
        </HierarchicalDataTemplate>

        <HierarchicalDataTemplate DataType="{x:Type local:MainCompViewModel}" ItemsSource="{Binding Children}">
            <StackPanel Orientation="Horizontal">
                <TextBlock Text="{Binding Maincompname}" />
            </StackPanel>
        </HierarchicalDataTemplate>

        <HierarchicalDataTemplate DataType="{x:Type local:FeatureViewModel}" ItemsSource="{Binding Children}">
            <StackPanel Orientation="Horizontal">
                <TextBlock Text="{Binding FeatureName}" />
            </StackPanel>
        </HierarchicalDataTemplate>

        <DataTemplate DataType="{x:Type local:CompViewModel}">
            <StackPanel Orientation="Horizontal">
                <TextBlock Text="{Binding Component}" />
            </StackPanel>
        </DataTemplate>                               
    </TreeViewItem.Resources>
    </TreeViewItem>
</TreeView>

代码后置

private void treeView1_SelectedItemChanged(object sender, RoutedPropertyChangedEventArgs<object> e)
{
    if(selected Item meets certain condition)
    {
         //Change color of tree node
    }
}

我该如何改变特定节点的颜色,并保留相同的颜色,以便在再次展开时仍然是红色。 任何帮助都将不胜感激。

看起来您可以通过数据绑定实现此功能 https://dev59.com/infZa4cB1Zd3GeqPOzQI - Geordie
3个回答

8

您可以在模型中创建一个布尔属性,当元素符合条件时为true。然后像这样绑定前景色:

                       <TreeView.ItemContainerStyle>
                            <Style TargetType="{x:Type TreeViewItem}">
                                <Style.Triggers>
                                    <DataTrigger Binding="{Binding Path=BoolProp}" Value="False">
                                        <Setter Property="Foreground" Value="Blue"></Setter>
                                    </DataTrigger>
                                    <DataTrigger Binding="{Binding Path=BoolProp}" Value="True">
                                        <Setter Property="Foreground" Value="Red"></Setter>
                                    </DataTrigger>
                                </Style.Triggers>
                            </Style>
                        </TreeView.ItemContainerStyle>

或者使用转换器:
                       <TreeView.ItemContainerStyle>
                            <Style TargetType="{x:Type TreeViewItem}">
                                <Setter Property="Foreground" Value="{Binding Path=BoolProp, Converter={StaticResource ResourceKey=TheKey}}"/>
                            </Style>
                        </TreeView.ItemContainerStyle>

选定节点后,其下所有子节点都会变成红色,而不是特定的元素。 - BinaryMee
@BinaryMee 你是如何解决所有子元素变成红色的问题的? - Pratik

4

只需更改前景色:

TreeViewItem ti = (TreeViewItem)treeView1.SelectedItem;
ti.Foreground = Brushes.Red;

出现了这个错误。'System.Windows.Controls.TreeView'不包含名为'SelectedNode'的定义,且没有接受类型为'System.Windows.Controls.TreeView'的第一个参数的扩展方法'SelectedNode'被找到(您是否缺少使用指示或程序集引用?) - BinaryMee
1
我认为应该是SelectedItem而不是SelectedNode - Florian Gl
是的,在WPF中,SelectedItem似乎是正确的方法(之前使用表单)。但是它返回一个对象。尝试像这样做: TreeViewItem ti =(TreeViewItem)treeView1.SelectedItem; ti.Foreground = Color.Red; - MedMik
尝试使用Brushes.Red而不是Color.Red。 - MedMik

0

这是嵌入到模板中的。您只能通过复制控件的默认Aero-Style并更改硬编码值来更改颜色。

或者通过在加载时深入可视树来进行更改。

要获取默认样式和模板,请通过此MSDN进行操作

也可以从这里逐步检查EXAMPLE


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接