开发者

How to disable WPF ContextMenu animations?

I'm trying to hunt down what bit I need to tweak to get ContextMenus in WPF to stop animating when they appear/disappear.

From what I can tell, WPF creates a Popup to host the ContextMenu. The Popup looks at its PopupAnimation property and decides how to animate. What I want to do is always have that set to "None".

I've tried setting a global unnamed style with a TargetType of Popup that sets PopupAnimation to None but this does not work. If I break in System.Windows.Controls.Primitives.Popup.SetupAnimations I can see 开发者_StackOverflowthat the animation type is still set to Fade. I'm guessing that it hasn't had a chance to apply styles yet..

I've tried hooking ContextMenuOpening but there's no access to a Popup in there that I could find.

What else could I try?

Note that this is sort of the second part of another question I asked here. The advice there worked great for menus and everything else we had that was animating, but the one exception has been ContextMenus. They animate based on properties in code, not a template. I verified this by pulling the ContextMenu template out using the advice given here.


I've been struggling with this too. I've found that the solution is to "override" the system parameter that control popup animation.

Do this by defining a resource (perhaps in your Themes\Generic.xaml) like this:

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


I spent a good half hour trying to figure out how to do this in code - I'm sure its obvious if you know the framework better:

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


In your previous question, Rob showed you the reason why it acts like that. Can you not create a new ControlTemplate for your ContextMenu and set PopupAnimation property to None like the following :

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

You could create your own ContextMenu or apply a ControlTemplate using the shown code to specific instances.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜