在WPF应用程序中打开或关闭ContextMenu时调整按钮的视觉状态

在WPF应用程序中打开或关闭ContextMenu时调整按钮的视觉状态,wpf,storyboard,eventtrigger,Wpf,Storyboard,Eventtrigger,在我正在开发的WPF应用程序中,有一个按钮样式,它定义了自己的模板(控制模板) 我通过ControlTemplate.Triggers处理视觉更新,如IsMouseOver: <Trigger Property="IsMouseOver" Value="True"> <Trigger.EnterActions> <BeginStoryboard> <Storyboard> <Doub

在我正在开发的WPF应用程序中,有一个
按钮
样式
,它定义了自己的
模板
控制模板

我通过
ControlTemplate.Triggers处理视觉更新,如
IsMouseOver

<Trigger Property="IsMouseOver" Value="True">
  <Trigger.EnterActions>
      <BeginStoryboard>
          <Storyboard>
            <DoubleAnimation 
              Storyboard.TargetName="IsMouseOverBorder" 
              Storyboard.TargetProperty="Opacity" 
              To="1" 
              Duration="0:0:0.08" />
          </Storyboard>
      </BeginStoryboard>
  </Trigger.EnterActions>
  <Trigger.ExitActions>
      <BeginStoryboard>
          <Storyboard>
            <DoubleAnimation 
              Storyboard.TargetName="IsMouseOverBorder" 
              Storyboard.TargetProperty="Opacity" 
              To="0" 
              Duration="0:0:0.16" />
          </Storyboard>
      </BeginStoryboard>
  </Trigger.ExitActions>
</Trigger>

你知道为什么这不起作用,或者是一种替代方法吗?

我使用问题中定义的样式来实现这一点,但我必须手动引发
ContextMenuService.ContextMenuClosingEvent
事件(使用一些反射):

<EventTrigger RoutedEvent="ContextMenuService.ContextMenuOpening">
  <BeginStoryboard Name="ContextMenuOpeningStoryboard">
    <Storyboard>
      <DoubleAnimation 
        Storyboard.TargetName="IsMouseOverBorder" 
        Storyboard.TargetProperty="Opacity" 
        To="1" 
        Duration="0" />
    </Storyboard>
  </BeginStoryboard>
</EventTrigger>

<EventTrigger RoutedEvent="ContextMenuService.ContextMenuClosing">
  <RemoveStoryboard BeginStoryboardName="ContextMenuOpeningStoryboard" />
</EventTrigger>
<ContextMenu Closed="ContextMenu_Closed">...</ContextMenu>
private void ContextMenu_Closed(object sender, RoutedEventArgs args)
{

  var type = typeof(ContextMenuEventArgs);

  var contextMenuEventArgs = (ContextMenuEventArgs) type.Assembly.CreateInstance
  (
    type.FullName, false, BindingFlags.Instance | BindingFlags.NonPublic, null, 
    new object[] { this, false }, null, null
  );

  if (contextMenuEventArgs != null) 
  {
    contextMenuEventArgs.RoutedEvent = ContextMenuService.ContextMenuClosingEvent;
    _myToggleButton.RaiseEvent(contextMenuEventArgs);
  }

}