在 XAML 中的 ContextMenu.IsOpen 上触发

Kop*_*ick 4 c# wpf triggers styles contextmenu

这是我想要做的:

<Style x:Key="TreeViewItemStyle">
    <Setter Property="TreeViewItem.ContextMenu" Value="{StaticResource ContextMenu}" />
        <Style.Triggers>
            <Trigger Property="TreeViewItem.ContextMenu.IsOpen" Value="True">
                <Setter Property="TreeViewItem.BitmapEffect">
                    <Setter.Value>
                        <OuterGlowBitmapEffect GlowColor="Yellow" GlowSize="2"/>
                    </Setter.Value>
                </Setter>
            </Trigger>
        </Style>
    ...
Run Code Online (Sandbox Code Playgroud)

但它显然不起作用,因为Property="TreeViewItem.ContextMenu.IsOpen"不被认可。对我需要更改的内容有什么建议吗?

Qua*_*ter 5

您可以使用 DataTrigger 绑定到上下文菜单的 IsOpened 属性:

<DataTrigger Binding="{Binding ContextMenu.IsOpen, RelativeSource={RelativeSource Self}}" Value="True">
    <Setter Property="Background" Value="Green"/>
</DataTrigger>
Run Code Online (Sandbox Code Playgroud)

不幸的是,由于 TreeView 中的所有项目共享相同的 ContextMenu,这将一次突出显示所有项目。似乎没有一个属性可以让您找出哪个 FrameworkElement 打开了 ContextMenu。

您可以处理 TreeViewItem 上的 ContextMenuOpening 和 ContextMenuClosing 事件,因为这些事件将从处理单击的控件冒泡并通过正确的 TreeViewItem。如果您想在 XAML 中执行此操作,您可以使用 EventTrigger 来启动更改您的属性的一帧动画。最干净的选择可能是编写处理 ContextMenuOpening 和 ContextMenuClosing 事件的附加行为,并在上下文菜单打开时将附加属性设置为 true。