2010-05-12 250 views
5

我有一個ListBox的項目,並已分配一個ContextMenu它與三個菜單項。除了其中一個菜單項啓動冗長的操作之外,一切正常。我想關閉處理程序中的ContextMenu,並可能顯示一個小時光標或其他東西。如何強制關閉ContextMenu(WPF項目)?

可以這樣做嗎?或者,我應該使用Popup嗎?如果是這樣,我該如何使用Popup來代替ContextMenu?我的假設是我將不得不完全管理它 - 放置和壽命。

謝謝!

回答

7

你可以簡單地Dispatcher.BeginInvoke下運行過長的操作:

private void OnSomeContextMenuCommand(object sender, EventArgs e) 
{ 
    Dispatcher.BeginInvoke(DispatcherPriority.Background, new Action(() => 
    { 
    // Put long-running operation here 
    })); 
} 

如果你這樣做,文本菜單將您的長時間運行的操作開始前關閉。

一般來說,我更喜歡這個解決方案來顯式地關閉ContextMenu,因爲它將UI與命令處理完全分開。

+0

嗨@Ray 我已經嘗試了上述建議,但它不適用於我,我做錯了嗎? Application.Current.Dispatcher.BeginInvoke(DispatcherPriority.Background,新行動(()=> { 的foreach(樹型視圖在項目(treeViewAdv.Items [0]爲樹型視圖).Items) { _RunTestScript(項目) ; } })); – Prithiv 2018-01-09 12:45:05

13

你想要的是:

myContextMenu.IsOpen = false; 

確保你的出現冗長的操作此之前調用。根據您的操作,您可能需要考慮通過在另一個線程上執行操作來使其成爲異步 - 這樣,您將不會暫停應用程序線程。

+0

雷伯恩斯可能有一個更好的答案爲問的情況,但有時你只是想強制關閉菜單關閉的原因不同,在這種情況下,這是最好的答案:) – viggity 2012-08-24 14:07:02