gpt4 book ai didi

c# - WPF TreeViewItem 上下文菜单取消突出显示项目

转载 作者:太空宇宙 更新时间:2023-11-03 11:47:32 25 4
gpt4 key购买 nike

我在这方面遇到问题已经有一段时间了,并且提出了一些不太理想的解决方案。问题在于,当打开 TreeViewItem 的上下文菜单时,TreeViewItem 会变灰。 TreeViewItem 是否可以在其上下文菜单打开时保持突出显示?

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 的问题。

最佳答案

WPF 的默认行为是在上下文菜单打开时将 TreeViewItem 更改为灰色,但实际上与 WPF 中的所有其他内容一样,您可以覆盖此行为:

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

这是附加属性:

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 :

<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 属性。绑定(bind)导致您的附加属性设置在 TreeViewItem 上。这与 IsSelected 相结合,调用触发器来更改前景色和背景色,以使项目仍然显示为选中状态。

关于c# - WPF TreeViewItem 上下文菜单取消突出显示项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3030292/

25 4 0