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

时间:2010-06-12 22:17:11

标签: c# wpf treeview

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

TreeViewItem灰显的问题是它与上下文菜单和TreeViewItem没有任何关系,而且看起来很难看。

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

    <TreeView>
        <TreeView.Resources>
            <Style TargetType="{x:Type TreeViewItem}">
                <Setter Property="ContextMenu">
                    <Setter.Value>
                        <ContextMenu>
                            <MenuItem Header="Menu Item 1" />
                            <MenuItem Header="Menu Item 2" />
                        </ContextMenu>
                    </Setter.Value>
                </Setter>
            </Style>
        </TreeView.Resources>
        <TreeViewItem Header="Item 1">
            <TreeViewItem Header="Sub-Item 1"/>
        </TreeViewItem>
        <TreeViewItem Header="Item 2"></TreeViewItem>
    </TreeView>

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

1 个答案:

答案 0 :(得分:2)

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

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

    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));
    }
    

    这是风格中的二传手:

    <Setter Property="my:TreeViewCustomizer.ContextMenuOpened"
            Value="{Binding ContextMenu.IsOpen, RelativeSource={RelativeSource Self}}" />
    

    这是触发器:

    <MultiTrigger>
      <MultiTrigger.Conditions>
        <Condition Property="IsSelected" Value="true"/>
        <Condition Property="my:TreeViewCustomizer.ContextMenuOpened" Value="true"/>
      </MultiTrigger.Conditions>
      <Setter TargetName="Bd"
              Property="Background"
              Value="{DynamicResource {x:Static SystemColors.HighlightBrushKey}}"/>
      <Setter Property="Foreground"
              Value="{DynamicResource {x:Static SystemColors.HighlightTextBrushKey}}"/>
    </MultiTrigger>
    

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