我正在努力寻找我需要调整的一点,以便在WPF中获取ContextMenus,以便在它们出现/消失时停止动画。
据我所知,WPF创建了一个Popup来托管ContextMenu。 Popup查看其PopupAnimation属性并决定如何设置动画。我想要做的就是将其设置为“无”。
我尝试使用Popup的TargetType设置一个全局未命名样式,将PopupAnimation设置为None但这不起作用。如果我在System.Windows.Controls.Primitives.Popup.SetupAnimations中断,我可以看到动画类型仍然设置为Fade。我猜它还没有机会申请风格..
我试过挂钩ContextMenuOpening但是我找不到可以找到的Popup。
我还能尝试什么?
请注意,这是我提出的另一个问题here的第二部分。那里的建议非常适合菜单和我们拥有的其他动画,但一个例外是ContextMenus。它们基于代码中的属性进行动画处理,而不是模板。我通过使用here给出的建议拉出ContextMenu模板来验证这一点。
答案 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
应用于特定实例。