WPF TreeViewItem 背景
当 TreeView
(或应用程序)失去焦点时,如何更改所选 TreeViewItem
的 Background
。在这种情况下,所选项目默认具有浅灰色背景。
编辑:第一个答案后尝试:但是将找不到带有 TargetName="Bd"
的元素。
<TreeView>
<TreeView.Resources>
<Style x:Key="{x:Type TreeViewItem}" TargetType="{x:Type TreeViewItem}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type TreeViewItem}">
<ControlTemplate.Triggers>
<MultiTrigger>
<MultiTrigger.Conditions>
<Condition Property="IsSelected" Value="True"/>
<Condition Property="IsSelectionActive" Value="False"/>
</MultiTrigger.Conditions>
<Setter TargetName="Bd" Property="Background" Value="{DynamicResource {x:Static SystemColors.ControlBrushKey}}" />
<Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}" />
</MultiTrigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</TreeView.Resources>
<TreeViewItem Header="Test1" IsExpanded="True">
<TreeViewItem Header="Test2" />
<TreeViewItem Header="Test3" />
<TreeViewItem Header="Test4" />
<TreeViewItem Header="Test5" />
</TreeViewItem>
</TreeView>
How can I change the Background
of a selected TreeViewItem
when the TreeView
(or the Application) looses Focus. A selected item by default has in this situation a light grey background.
EDIT: A try after first answer: But element with TargetName="Bd"
will not be found.
<TreeView>
<TreeView.Resources>
<Style x:Key="{x:Type TreeViewItem}" TargetType="{x:Type TreeViewItem}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type TreeViewItem}">
<ControlTemplate.Triggers>
<MultiTrigger>
<MultiTrigger.Conditions>
<Condition Property="IsSelected" Value="True"/>
<Condition Property="IsSelectionActive" Value="False"/>
</MultiTrigger.Conditions>
<Setter TargetName="Bd" Property="Background" Value="{DynamicResource {x:Static SystemColors.ControlBrushKey}}" />
<Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}" />
</MultiTrigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</TreeView.Resources>
<TreeViewItem Header="Test1" IsExpanded="True">
<TreeViewItem Header="Test2" />
<TreeViewItem Header="Test3" />
<TreeViewItem Header="Test4" />
<TreeViewItem Header="Test5" />
</TreeViewItem>
</TreeView>
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
您需要修改
TreeViewItem
的默认样式。特别是,您需要修改以下触发器:如您所见,如果项目获得焦点并且选择未处于活动状态(焦点在其他地方)。
更新:
Aero 主题的
TreeViewItem
的完整样式如下所示:为此,您还需要这样:
在所有这些中,您只需要修改您所在的部分感兴趣(如果选择处于非活动状态,则为背景颜色)并将这些样式放置在主窗口 App.xaml 的资源部分中。
You need to modify the default style for
TreeViewItem
. Particularly, you need to modify the following trigger:As you can see the trigger sets the background to
{DynamicResource {x:Static SystemColors.ControlBrushKey}}
if the item is focused and the selection is not active (focus is somewhere else).Update:
The full style of
TreeViewItem
for Aero theme looks like this:For that you'll also need this:
In all of this you need to modify only the part you are interested in (the background color if selection is inactive) and place those styles in the resources section in App.xaml in your main window.
对于您的特定情况,存在更简单的方法。与在 ListBox 中一样,您可以使用 TreeViewItem 的使用样式替换 ControlBrush 资源:
您可以指定任何其他颜色。建议使用不透明度,因为如果您有多个 TreeView/ListBox,您可以确定哪一个是焦点。但当然,编辑完整样式可以为您将来的自定义带来更大的灵活性。
梯度样本:
More easy way for your particular case exists. Like in ListBox, you can replace ControlBrush resource for TreeViewItem's using style:
You can specify any other color. Opacity is suggested because if your have several TreeView/ListBox you can determine which one is focused. But of course, editing full style can bring you much more flexibility for future customizations.
Sample with gradients:
如果您不想覆盖默认的控件模板,您可以使用文本块为标题定义自己的模板,并将该模板中的样式应用到文本块本身(TreeViewItem 的默认控件模板中有一个小填充,因此您可以还应该将其设置为零以实现像素完美)。
If you don't want to override the default contol template, you can define your own template for the headers using textblock and apply the style in that template to the textblock itself (there's a small padding in the default control template of TreeViewItem, so you should also set it to zero to achieve pixel-perfection).