如何禁用WPF ContextMenu动画?

17

我正在尝试找到需要调整的位,以便在WPF中停止ContextMenus出现/消失时的动画效果。

据我了解,WPF创建一个Popup来托管ContextMenu。 Popup查看其PopupAnimation属性并决定如何进行动画。我想做的是始终将其设置为“无”。

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

我尝试钩取ContextMenuOpening,但在其中没有找到可以访问Popup的方法。

我还能尝试什么?

请注意,这是我在这里提出的另一个问题的第二部分。那里给出的建议对于菜单和我们拥有的所有其他动画效果都非常有效,但唯一的例外是ContextMenus。它们基于代码中的属性进行动画处理,而不是模板。我使用此处给出的建议将ContextMenu模板拿出来进行了验证。

3个回答

36

我也一直在苦苦挣扎。我发现解决方法是“覆盖”控制弹出动画的系统参数

通过定义资源(可能在您的Themes\Generic.xaml中)来执行此操作:

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

谢谢,这正是我在寻找的!哇!开心的一天。 - scobi
谢谢!我一直觉得WPF上下文菜单与系统菜单相比较慢。现在我知道这是由于动画引起的。 - ghord

6

我花了半个小时的时间试图在代码中解决这个问题——如果您更熟悉框架,那么这很明显:

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

0
在你之前的问题中,Rob 向你展示了它为什么会这样的原因。你可以尝试创建一个新的 ControlTemplate 用于你的 ContextMenu,并将 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以停止动画,但无法弄清楚它来自何处或如何更改它。 - scobi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接