C# XAML中ContextMenu.IsOpen上的触发器

C# XAML中ContextMenu.IsOpen上的触发器,c#,wpf,triggers,contextmenu,styles,C#,Wpf,Triggers,Contextmenu,Styles,以下是我想做的: <Style x:Key="TreeViewItemStyle"> <Setter Property="TreeViewItem.ContextMenu" Value="{StaticResource ContextMenu}" /> <Style.Triggers> <Trigger Property="TreeViewItem.ContextMenu.IsOpen" Value="Tr

以下是我想做的:

<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>
    ...

...

但它显然不起作用,因为无法识别
Property=“treevieItem.ContextMenu.IsOpen”
。对我需要更改的内容有何建议?

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

<DataTrigger Binding="{Binding ContextMenu.IsOpen, RelativeSource={RelativeSource Self}}" Value="True">
    <Setter Property="Background" Value="Green"/>
</DataTrigger>

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


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

我如何使我的文章格式XAML更好一点呢?:)使用缩进或反引号。