2010-06-04 24 views
5

有誰知道是否有可能在WPF ContextMenu關閉時觸發動畫?如何觸發WPF ContextMenu的關閉動畫?

我有打開ContextMenu時觸發動畫的代碼。動畫使上下文菜單淡入視圖。當ContextMenu關閉時,我也想要一個動畫,使它淡出。

啓動打開淡入動畫看起來像這樣的代碼:

 var animation = new DoubleAnimation(); 
     animation.From = 0; 
     animation.To = 1; 
     animation.Duration = TimeSpan.FromSeconds(0.2); 
     animation.Freeze(); 

     menu.BeginAnimation(ContextMenu.OpacityProperty, animation); 

淡入動畫也運行在子菜單項。

請注意,除了淡入和淡出之外,我還想運行其他動畫。例如,我希望上下文菜單從無到有擴大規模,以便將其「反彈」到視圖中。

+0

您可以在打開contextmenu時發佈動畫代碼嗎? – Amsakanna 2010-06-04 10:37:46

回答

0

你不能夠使用ContextMenuClosing事件

+0

不幸的是,事件太晚了!我可以開始淡出動畫,但它沒有任何效果,因爲上下文菜單馬上消失。 – 2010-06-04 16:02:58

7

比Popup.PopupAnimation其他,可能是在文本菜單或彈出式無鉤,讓你延緩文本菜單的拆解,窗口的破壞等,足夠長的時間來顯示你的動畫。這使你有幾種選擇:

  1. 您可以使用Popup.PopupAnimation延遲彈出關閉,然後用自己的替換它的動畫,
  2. 您可以在的ContextMenuClosing自己彈出呈現文本菜單,播放動畫,並刪除在它

  • 您可以實現自己的代碼來處理單擊鼠標右鍵,按住Shift-F10等創建彈出並顯示文本菜單使用Popup.PopupAnimation

    在ContextMenuOpened事件中,找到彈出窗口並將Popup.PopupAnimation設置爲任何動畫,然後監視Popup.IsOpen,並在IsOpen屬性變爲false時,使用Dispatcher回調來替換您自己的預定動畫。你的動畫可以重用由Popup類創建的TranslateTransform,或者它可以添加自己的變換。

    這種技術很簡單,兼容,但缺點是你無法控制彈出決定關閉和拆除時間之間(固定)間隔的持續時間。它似乎大約是1/6秒,所以如果你能忍受這一點,這可能是一條路。

    使用自己的彈出關閉動畫

    在你買的ContextMenuClosing這是顯示菜單已經不見了彈出的時間過程中顯示文本菜單,但你可以暫時創建一個新的。

    爲了避免閃爍,必須在DisplatchPriority.Render或更高版本上完成此操作。此外,新彈出窗口必須與菜單彈出窗口中創建的位置和大小完全相同。這些座標可以在ContextMenuOpened事件之後立即記錄下來。您必須在Dispatcher回調中執行此操作,因爲在ContextMenuOpened事件中,期間的座標實際上不可用

    所以程序如下:

    • 在ContextMenuOpened,做記錄的彈出位置和大小的行動的Dispatcher.BeginInvoke。
    • 在ContextMenuClosed,做構建在該位置和大小,其孩子是文本菜單的彈出一個操作的Dispatcher.BeginInvoke,設置其ISOPEN真實,啓動動畫
    • 當動畫結束(這可以用做一個計時器),設置Popup的IsOpen爲false並清除其子屬性
    • 不要忘記在動畫時間內確保ContextMenu的DataContext設置正確,以便它將顯示與ContextMenu關閉前相同的數據。

    實現您自己的文本菜單處理代碼

    如果您的標記在ContextMenuOpened事件ContextMenuEventArgs.Handled真,文本菜單代碼實際上並沒有做任何事情,讓你呈現的ContextMenu自己。要做到這一點:

    1. 構建一個彈出窗口,計算合理的配置(!這絕對是不平凡的),並添加文本菜單作爲其子
    2. 設置Popup.IsOpen真實的,開始你的開場動畫
    3. 當它是時間的ContextMenu關閉,啓動關閉動畫,然後設置Popup.IsOpen假並清除其子屬性

    的這個棘手的部分是可靠地決定何時關閉文本菜單(步驟3)基於用戶操作。我不知道有什麼方法可以重用.NET Framework的內置機制,而ContextMenu應該關閉的規則相當複雜。

  • +0

    感謝您提供非常詳細的答案,我會盡快將其應用於我的代碼。 – 2010-06-05 10:38:56

    +0

    雙倍感謝細節。 – scobi 2010-07-01 17:56:52