No hay una buena manera de hacerlo con un control ContextMenu
. Esa es solo una envoltura alrededor de los menús nativos Win32, por lo que se ve mucho mejor. Se dibuja utilizando las API de OS, al igual que los menús en todas las demás aplicaciones.
Compárelo con el control ContextMenuStrip
, que es completamente dibujado por el framework en código C#. Parecía súper genial (supongo) cuando se lanzó por primera vez, cuando Windows y Office XP eran los productos más nuevos en los estantes. Cuando se lanzó Windows Vista, se volvió terriblemente obsoleto. La única ventaja que tiene tiene es que tiene un control mucho más fino sobre los menús. Por ejemplo, puede alojar controles personalizados en los menús, y puede evitar que el menú se cierre al hacer clic en uno de los elementos. Los menús nativos Win32 no tienen soporte para eso.
Por supuesto, es más que una omisión de supervisión o accidental. El deseo de mantener abierto un menú contextual después de que el usuario haya seleccionado algo es una buena pista de que su diseño es incorrecto. Tenga en cuenta que el objetivo de un menú contextual es brindarle al usuario un acceso rápido a las opciones contextualmente relevantes. Todo lo que tienen que hacer es hacer clic derecho (o presionar un botón especial en su teclado), y pueden ver un menú de opciones directamente relacionadas con lo que están trabajando o tratando de lograr. Al igual que un menú normal, se supone que pueden seleccionar una opción y hacer que el menú desaparezca.
En Windows, todos los menús son de "cierre automático". Si el menú debe ser persistente, no debe ser un menú en absoluto. Considere utilizar una barra de herramientas, una barra lateral o algún tipo de control personalizado en su lugar. Esos no están diseñados para desaparecer cuando se selecciona una de sus opciones y, por lo tanto, son ideales para mostrar opciones relacionadas que siempre deberían estar visibles.
Si un menú contextual en una aplicación no desapareció después de seleccionar una opción, consideraría que se trata de un error. Por lo menos, asumiría que mi selección no "tomó" e intenté hacer clic de nuevo.
No tengo la más mínima idea de por qué el equipo de WPF decidió proporcionar una opción de StaysOpen
por sus menús de contexto, o por qué volvió a escribir su propia clase menú contextual en el primer lugar. ¿No aprendieron algo del equipo de WinForms después de haber hecho lo mismo?
La única forma de hacer lo que está pidiendo con el control ContextMenu
(y por lo tanto los menús nativos) es un truco similar al que describe: almacena la posición previa del menú y después de seleccionar un comando , vuelva a mostrar el menú emergente en su ubicación anterior. Cualquiera que sea la cura que se le ocurra para el parpadeo (por ejemplo, congelar la pantalla y suprimir los repintados hasta que se vuelva a mostrar el menú contextual), casi se garantiza que será peor que la enfermedad.
Volví y acepté algunas respuestas de mis otras preguntas. En el momento en que los hice, no sabía que debías hacer eso. – Aidan
No hay problema. Siempre es bueno aceptar respuestas correctas. De esa forma la comunidad puede construir reputación. – CodeLikeBeaker