如何禁用WPF ContextMenu动画?

时间:2010-07-01 18:08:06

标签: wpf

我正在努力寻找我需要调整的一点,以便在WPF中获取ContextMenus,以便在它们出现/消失时停止动画。

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

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

我试过挂钩ContextMenuOpening但是我找不到可以找到的Popup。

我还能尝试什么?

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

3 个答案:

答案 0 :(得分:25)

我也一直在努力解决这个问题。我发现解决方案是“覆盖”system parameter that control popup animation

通过定义资源(可能在Themes\Generic.xaml中)这样做:

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

答案 1 :(得分:5)

我花了半个小时试图弄清楚如何在代码中执行此操作 - 如果您更好地了解框架,我肯定很明显:

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

答案 2 :(得分: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应用于特定实例。