【问题标题】:Changing Foreground of a TreeViewItem upon selection选择时更改 TreeViewItem 的前景
【发布时间】:2013-08-21 15:58:22
【问题描述】:

在我的程序中,我有一个TreeView,用户可以从中选择不同的项目。我的 TreeView 中有一些项目是在我的 c# 代码隐藏中创建时自定义的。

像这样:

public static TreeViewItem newItem = new TreeViewItem() //Child Node
{
       Header = new StackPanel //ICON
       {
           Orientation = Orientation.Horizontal,
           Children =
           {
               new Border {
                   Width = 12,
                   Height = 14,

                   Background = Brushes.Blue,
                   BorderThickness = new Thickness(1.0),
                   BorderBrush = Brushes.Black
              },
              new Label {
                  Content = "Node1"
              }
           }
      }
};

我希望这些项目在被选中时显示为 WHITE foregrounds(就像默认节点行为一样)。

这是我迄今为止在 XAML 中尝试过的。这是我为TreeViewItems 设置的样式模板。我没有收到编译器错误,但由于某种原因,当我运行程序时,我的TreeView 不可见。

<Style TargetType="{x:Type TreeViewItem}" >
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="{x:Type TreeViewItem}">
                        <ControlTemplate.Triggers>
                            <Trigger Property="IsSelected" Value="True" >
                                <Setter Property="Foreground" Value="White" />
                            </Trigger>
                            <Trigger Property="IsSelected" Value="False" >
                                <Setter Property="Foreground" Value="Black" />
                            </Trigger>
                        </ControlTemplate.Triggers>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
</Style>

如何解决此问题,以便我的所有 TreeView 节点在选中时都显示为白色 foregrounds

【问题讨论】:

  • 如果我使用TextBlock 是否允许Foreground 更改?

标签: c# wpf treeview foreground


【解决方案1】:

这是因为你完全重写了模板,而不是写任何东西。只是设置触发器,不一定要在模板中做,你可以在Style中设置。模板通常设置为更改可视树中的元素。试试这个例子:

<Window.Resources>
    <Style TargetType="{x:Type TreeViewItem}">
        <Style.Resources>
            <!-- Set Highlight Background color -->
            <SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}" Color="Black" />
        </Style.Resources>

        <Style.Triggers>
            <Trigger Property="IsSelected" Value="True">
                <!-- Set Foreground color -->
                <Setter Property="Foreground" Value="White" />
            </Trigger>
        </Style.Triggers>
    </Style>
</Window.Resources>

<Grid>
    <TreeView>
        <TreeViewItem Header="Root">
            <TreeViewItem Header="Child1" />
            <TreeViewItem Header="Child2" />
            <TreeViewItem Header="Child3" />
            <TreeViewItem Header="Child4" />
        </TreeViewItem>
    </TreeView>
</Grid>

更多信息,请参见:

Styling and Templating on MSDN

Example of TreeView Style/Template on MSDN

EDIT

试试这个:

public TreeViewItem newItem = new TreeViewItem() //Child Node
{
    Header = new StackPanel 
    {
        Orientation = Orientation.Horizontal,

        Children =
        {
            new Border 
            {
                Width = 12,
                Height = 14,

                Background = Brushes.Blue,
                BorderThickness = new Thickness(1.0),
                BorderBrush = Brushes.Black
            },

            new Label 
            {
                Content = "Node1",
                Foreground = Brushes.Black,
            }
        }
    }
};

private void AddItem_Click(object sender, RoutedEventArgs e)
{
    // Set Selected handler on Selected event
    newItem.Selected += new RoutedEventHandler(newItem_Selected);

    // Set Unselected handler on Unselected event
    newItem.Unselected += new RoutedEventHandler(newItem_Unselected);

    // Add your item
    MyTreeView.Items.Add(newItem);
}

// Set the black color for foreground
private void newItem_Unselected(object sender, RoutedEventArgs e) 
{
    TreeViewItem MyTreeViewItem = sender as TreeViewItem;
    StackPanel MyStackPanel = MyTreeViewItem.Header as StackPanel;
    Label MyLabel = MyStackPanel.Children[1] as Label;

    MyLabel.Foreground = Brushes.Black;
}

// Set the white color for foreground
private void newItem_Selected(object sender, RoutedEventArgs e)
{
    TreeViewItem MyTreeViewItem = sender as TreeViewItem;
    StackPanel MyStackPanel = MyTreeViewItem.Header as StackPanel;
    Label MyLabel = MyStackPanel.Children[1] as Label;

    MyLabel.Foreground = Brushes.White;         
}

Note: 如果您使用TreeViewItem 的模板,此代码可以缩短并更容易。

【讨论】:

  • 这适用于所有正常的TreeViewItems,但我在问题中提到的那些没有受到影响(自定义的)。
  • @Ericafterdark,我认为您的代码中不需要 Label。除非您真的需要将其替换为 TextBlock,否则使用 Style 的原始、更简单的解决方案应该立即适用于您的项目
  • @Anatoliy Nikolaev,如果我通过单击按钮添加节点,这个答案似乎会起作用。但目前我的选定节点由SelectedItemChanged 方法控制。我将如何从 SelectedItemChanged 方法调用这些事件处理程序? @dkozl - 将其更改为 TextBlock
  • @Eric after dark: 只需将两个事件添加到您的newItem,如下所示:newItem.Selected += new RoutedEventHandler(newItem_Selected);,例如在添加 TreeView.Items 之前。你以某种方式添加?
猜你喜欢
  • 2014-03-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-21
  • 1970-01-01
  • 2020-02-28
相关资源
最近更新 更多