2010-07-01 63 views
10

我試圖尋找什麼位,我需要調整WPF中的ContextMenus停止動畫時,他們出現/消失。如何禁用WPF ContextMenu動畫?

從我所知道的,WPF創建一個Popup來承載ContextMenu。 Popup查看其PopupAnimation屬性並決定如何進行動畫處理。我想要做的是始終將其設置爲「無」。

我試着用PopupAnimation設置爲None的TargetType類型的PopupAnimation來設置一個全局的未命名樣式,但是這不起作用。如果我在System.Windows.Controls.Primitives.Popup.SetupAnimations中斷,我可以看到動畫類型仍然設置爲Fade。我猜測它還沒有機會申請樣式呢..

我已經試過掛鉤ContextMenuOpening,但沒有訪問彈出式窗口,在那裏,我可以找到。

我還能嘗試什麼?

請注意,這是我詢問here的另一個問題的第二部分。那裏的建議非常適用於菜單和我們擁有的其他所有動畫,但一個例外是ContextMenus。它們基於代碼中的屬性進行動畫製作,而不是模板。我通過使用here的建議將ContextMenu模板拉出來驗證了這一點。

回答

22

我一直在爲此苦苦掙扎。我發現解決方案是「覆蓋」system parameter that control popup animation

通過(在你的Themes\Generic.xaml也許)定義資源這樣的操作:

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

謝謝,這正是我一直在尋找的!嗚!快樂的一天。 – scobi 2011-07-21 22:05:43

0

在你之前的問題中,Rob向你展示了它這樣做的原因。你不能爲您的ContextMenuControlTemplate並設置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

+0

正如我上面所說,ContextMenu是不同的。 Rob解釋的是MenuItem模板內部的一個綁定,它直接向操作系統請求標誌是否應該設置動畫。在這種情況下,Popup類中存在執行該工作的代碼。雖然MenuItem的模板包含易於在模板重寫中禁用的動畫,但ContextMenu通過WPF內部的東西放入該Popup中。我需要一種方法來在構建時訪問其包含的Popup來殺死動畫,但無法弄清楚它來自哪裏或如何改變它。 – scobi 2010-07-01 21:36:31

5

我花了好半小時試圖找出如何做到這一點的代碼 - 我敢肯定,其明顯的,如果你知道框架更好:

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