2010-05-12 11 views
5

Tengo un ListBox con elementos, y le he asignado un ContextMenu con tres elementos de menú. Todo funciona bien, excepto que uno de los elementos del menú inicia una operación larga. Me gustaría cerrar el ContextMenu desde el controlador, y tal vez mostrar un cursor de reloj de arena o algo así.¿Cómo puedo forzar a un ContextMenu a cerrar (proyecto WPF)?

¿Se puede hacer eso? O, ¿debería usar una ventana emergente? Si es así, ¿cómo uso un Popup en lugar de un ContextMenu? Mi suposición es que tendría que gestionarlo por completo: ubicación y vida.

Gracias!

Respuesta

7

Simplemente puede ejecutar su operación lengthly bajo Dispatcher.BeginInvoke:

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

Si hace esto, el ContextMenu se cerrará antes de que comience su operación de larga duración.

En general, prefiero esta solución para cerrar explícitamente el ContextMenu porque separa completamente la UI del manejo de comandos.

+0

Hola @Ray I He intentado con la sugerencia anterior, pero no funciona para mí. ¿Estoy haciendo algo mal? Application.Current.Dispatcher.BeginInvoke (DispatcherPriority.Background, nueva acción (() => { foreach (artículo TreeViewItem en (treeViewAdv.Items [0] como TreeViewItem) .Items) { _RunTestScript (elemento) ; } })); – Prithiv

13

Lo que quiere decir:

myContextMenu.IsOpen = false; 

Asegúrese de llamar a este antes de que se presente la operación larga. Dependiendo de su operación, es posible que desee considerar hacerla asíncrona realizando la operación en otro subproceso, de esa manera, no detendrá el subproceso de la aplicación.

+0

Ray Burns probablemente tiene una mejor respuesta para la situación sobre la que se pregunta, pero a veces solo quiere forzar el cierre de un menú contextual por una razón diferente, en cuyo caso, esta es la mejor respuesta :) – viggity

Cuestiones relacionadas