簡體   English   中英

如何觸發WPF ContextMenu的結束動畫?

[英]How do I trigger a closing animation for a 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);

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

請注意,除了淡入和淡出之外,我還想運行其他動畫。 例如,我希望上下文菜單從零開始向上擴展,以便將其“反彈”到視圖中。

除了Popup.PopupAnimation之外,ContextMenu或Popup中沒有鈎子允許你延遲拆除ContextMenu,破壞窗口等,足以顯示你的動畫。 這給你留下了幾個選擇:

  1. 您可以使用Popup.PopupAnimation延遲彈出窗口關閉,然后用您自己的動畫替換它的動畫,
  2. 您可以在ContextMenuClosing中在自己的Popup中顯示ContextMenu,播放動畫並將其刪除
  3. 您可以實現自己的代碼來處理右鍵單擊,Shift-F10等,以創建Popup並在其中顯示ContextMenu

使用Popup.PopupAnimation

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

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

使用您自己的Popup在關閉動畫期間顯示ContextMenu

當您獲得ContextMenuClosing時,顯示菜單的Popup已經消失,但您可以暫時創建一個新的。

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

所以程序如下:

  • 在ContextMenuOpened上,執行記錄彈出窗口位置和大小的Action的Dispatcher.BeginInvoke。
  • 在ContextMenuClosed上,執行一個Action的Dispatcher.BeginInvoke,它在那個Child是ContextMenu的位置和大小上構造一個Popup,將其IsOpen設置為true,啟動動畫
  • 當動畫結束時(可以使用計時器完成),將Popup的IsOpen設置為false並清除其Child屬性
  • 不要忘記確保在動畫時間內正確設置ContextMenu的DataContext,這樣它將顯示與關閉ContextMenu之前相同的數據。

實現您自己的ContextMenu處理代碼

如果在ContextMenuOpened事件中將ContextMenuEventArgs.Handled標記為true,則ContextMenu代碼實際上不會執行任何操作,從而允許您自己呈現ContextMenu。 去做這個:

  1. 構造一個Popup,計算適當的位置(這絕對是非平凡的!),並將ContextMenu添加為其子項
  2. 將Popup.IsOpen設置為true並開始打開動畫
  3. 當ContextMenu關閉時,啟動結束動畫,然后將Popup.IsOpen設置為false並清除其Child屬性

其中棘手的部分是根據用戶操作可靠地決定何時關閉ContextMenu(步驟3)。 我不知道有任何方法可以重用.NET Framework的內置機制,並且ContextMenu關閉時的規則非常復雜。

您無法使用ContextMenuClosing事件

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM