2010-05-12 5 views
5

J'ai un ListBox avec des éléments, et lui ai assigné un ContextMenu avec trois éléments de menu. Tout fonctionne correctement sauf que l'un des éléments du menu lance une opération longue. Je voudrais fermer le ContextMenu du gestionnaire, et peut-être afficher un curseur de sablier ou quelque chose.Comment puis-je forcer la fermeture d'un ContextMenu (projet WPF)?

Cela peut-il être fait? Ou, devrais-je utiliser un Popup à la place? Si oui, comment utiliser un Popup au lieu d'un ContextMenu? Mon hypothèse est que je devrais le gérer complètement - placement et durée de vie.

Merci!

Répondre

7

Vous pouvez simplement lancer votre opération lengthly sous Dispatcher.BeginInvoke:

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

Si vous faites cela, le ContextMenu fermera avant votre opération de longue durée commence.

En général, je préfère cette solution à la fermeture explicite du ContextMenu, car elle sépare complètement l'interface utilisateur de la gestion des commandes.

+0

Hi @Ray I J'ai essayé la suggestion ci-dessus, mais cela ne fonctionne pas pour moi, je fais mal? Application.Current.Dispatcher.BeginInvoke (DispatcherPriority.Background, nouvelle action (() => { foreach (point TreeViewItem dans (treeViewAdv.Items [0] comme TreeViewItem) .Items) { _RunTestScript (article) ; } })); – Prithiv

13

Qu'est-ce que vous voulez est:

myContextMenu.IsOpen = false; 

Assurez-vous d'appeler cette avant votre longue opération se produit. En fonction de votre opération, vous pouvez envisager de le rendre asynchrone en effectuant l'opération sur un autre thread - de cette façon, vous n'arrêterez pas le thread d'application.

+0

Ray Burns a probablement une meilleure réponse à la situation demandée, mais parfois vous voulez juste forcer un menu contextuel à fermer pour une raison différente, auquel cas, c'est la meilleure réponse :) – viggity