【问题标题】:How to disable WPF ContextMenu animations?如何禁用 WPF ContextMenu 动画?
【发布时间】:2022-03-12 06:01:48
【问题描述】:

我正在尝试寻找我需要调整哪些位以使 WPF 中的 ContextMenus 在它们出现/消失时停止动画。

据我所知,WPF 创建了一个 Popup 来承载 ContextMenu。 Popup 查看其 PopupAnimation 属性并决定如何制作动画。我想要做的是始终将其设置为“无”。

我尝试设置一个全局未命名样式,其 TargetType 为 Popup,将 PopupAnimation 设置为 None,但这不起作用。如果我中断 System.Windows.Controls.Primitives.Popup.SetupAnimations 我可以看到动画类型仍设置为 Fade。我猜它还没有机会应用样式..

我已尝试挂钩 ContextMenuOpening,但我无法找到其中的 Popup。

我还能尝试什么?

请注意,这是我向here 提出的另一个问题的第二部分。那里的建议非常适用于菜单和我们拥有的所有其他动画,但一个例外是 ContextMenus。它们基于代码中的属性而不是模板进行动画处理。我通过使用here 给出的建议拉出 ContextMenu 模板来验证这一点。

【问题讨论】:

    标签: wpf


    【解决方案1】:

    我也一直在为此苦苦挣扎。我发现解决方案是“覆盖”system parameter that control popup animation

    通过像这样定义一个资源(可能在您的Themes\Generic.xaml)来做到这一点:

    <PopupAnimation x:Key="{x:Static SystemParameters.MenuPopupAnimationKey}">None</PopupAnimation>
    

    【讨论】:

    • 谢谢,这正是我想要的!哇!快乐的一天。
    • 谢谢!我一直觉得 WPF 上下文菜单与系统菜单相比显得迟钝。现在我知道这是由动画引起的。
    【解决方案2】:

    我花了半个小时试图弄清楚如何在代码中做到这一点 - 如果你更了解框架,我相信这很明显:

    var app = new Application();
    app.Resources.Add(SystemParameters.MenuPopupAnimationKey, PopupAnimation.None);
    app.Run(myThing);
    

    【讨论】:

      【解决方案3】:

      在您之前的问题中,Rob 向您展示了它为什么会这样。您能否为您的ContextMenu 创建一个新的ControlTemplate 并将PopupAnimation 属性设置为None,如下所示:

                     <Popup x:Name="PART_Popup" 
                         AllowsTransparency="true" 
                         Focusable="false" 
                         HorizontalOffset="-2" 
                         IsOpen="{Binding IsSubmenuOpen, 
                                  RelativeSource={RelativeSource TemplatedParent}}" 
                         PopupAnimation="None" 
                         Placement="Right" 
                         VerticalOffset="-3">
      

      您可以创建自己的ContextMenu 或使用显示的代码将ControlTemplate 应用于特定实例。

      【讨论】:

      • 正如我上面所说的,ContextMenu 是不同的。 Rob 解释的是 MenuItem 模板内部的绑定,它直接向操作系统询问是否应该设置动画的标志。在这种情况下,Popup 类中有代码在做这项工作。虽然 MenuItem 的模板包含很容易在模板覆盖中禁用的动画,但 ContextMenu 被 WPF 内部的某些东西放在该 Popup 中。我需要一种方法来在构建时访问其包含的 Popup 以终止动画,但无法弄清楚它来自哪里或如何改变它。
      猜你喜欢
      • 2020-07-04
      • 1970-01-01
      • 2010-09-05
      • 1970-01-01
      • 2013-01-19
      • 2021-01-18
      • 2016-07-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多