2010-06-22 72 views
1

这里就是我想要做的事:触发ContextMenu.IsOpen在XAML

<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="TreeViewItem.ContextMenu.IsOpen"无法识别。对我需要改变的任何建议?

+0

如何让我的帖子格式XAML更好一点? :) – KopfSick 2010-06-22 10:56:38

+0

使用缩进_或_反引号。 – 2010-06-22 11:02:36

回答

2

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

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

不幸的是,因为所有的TreeView控件共享相同的文本菜单中的项目,将突出显示所有这些一次的。似乎没有一个属性可以让你找出哪个FrameworkElement打开了ContextMenu。

您可以在TreeViewItem上处理ContextMenuOpening和ContextMenuClosing事件,因为这些事件会从处理点击并通过正确的TreeViewItem的控件中冒出来。如果你想在XAML中做到这一点,你可以使用EventTrigger来启动一个改变属性的单帧动画。最简洁的选项可能是编写一个处理ContextMenuOpening和ContextMenuClosing事件的附加行为,并在上下文菜单打开时将附加属性设置为true。