WPF TreeViewItem上下文菜单取消亮点项目

我一直有这个问题已经有一段时间了,并提出了一些不太理想的解决方案。 问题是当打开TreeViewItem的上下文菜单时,TreeViewItem将显示为灰色。 TreeViewItem在其ContextMenu打开时是否可以保持突出显示?

TreeViewItem变灰的问题在于它与上下文菜单和TreeViewItem没有任何关系,它看起来很难看。

通常,我用于设置上下文菜单的代码是这样的。 有时上下文菜单将由代码使用PreviewRightMouseButtonDown EventSetter生成,但它没有区别:

                  

到目前为止,我发现的唯一解决方案是使用聚焦颜色覆盖“灰色”未聚焦颜色,但是TreeView似乎永远不会聚焦,例如当单击另一个控件时。 我也遇到了ListViews的问题。

WPF的默认行为是在ContextMenu打开时将TreeViewItem更改为灰色,但与WPF中几乎所有其他内容一样,您可以覆盖此:

  1. 创建附加属性ContextMenuOpened
  2. 在TreeViewItem样式中,将ContextMenuOpened绑定到“ContextMenu.IsOpen”
  3. 当ContextMenuOpened和IsSelected都为true时,添加一个更改画笔的触发器

这是附属物:

 public class TreeViewCustomizer : DependencyObject { public static bool GetContextMenuOpened(DependencyObject obj) { return (bool)obj.GetValue(ContextMenuOpenedProperty); } public static void SetContextMenuOpened(DependencyObject obj, bool value) { obj.SetValue(ContextMenuOpenedProperty, value); } public static readonly DependencyProperty ContextMenuOpenedProperty = DependencyProperty.RegisterAttached("ContextMenuOpened", typeof(bool), typeof(TreeViewCustomizer)); } 

这是风格的二传手:

  

这是触发器:

         

工作原理:每次ContextMenu打开时,都会设置其IsOpen属性。 绑定会导致在TreeViewItem上设置附加属性。 这与IsSelected一起调用触发器,该触发器更改前景色和背景色以使项目仍然显示为选中状态。