Pregunta

hace un tiempo me encontré con una situación en la que necesitábamos mostrar cuadros de mensajes al usuario para recibir notificaciones, pero no pudimos usar MessageBox.Show porque bloquea el hilo de la GUI (por lo que nada en la pantalla se actualiza mientras se abre el diálogo activo). ¿Alguna sugerencia sobre una alternativa?

[Codifiqué una alternativa en ese momento pero no me gusta. Lo publicaré como respuesta si no aparece nada mejor]

EDITAR: el diálogo debe flotar en la parte superior de la ventana principal; No me importa si aparece en la barra de tareas o no. Más de un diálogo puede estar activo a la vez en ciertas circunstancias.

ADDENDUM: mi solución fue un formulario base que proporcionaba botones OK y CANCEL para emitir eventos Completados y Cancelados; OK llamó a ValidateData virtual para la anulación de subclase. El formulario de llamada utilizaba propiedades para evitar recrear el formulario cada vez (el formulario estaba oculto en lugar de cerrado) y mantenía un diccionario de formularios activos para evitar que el mismo formulario se activara más de una vez. Parece un formulario modal, admite múltiples formularios emergentes a la vez, pero no ata el hilo principal de la GUI.

¿Fue útil?

Solución

Estoy de acuerdo con rslite y Mitchel Sellers. Crear una forma no modal para mostrar la información necesaria es la mejor ruta a seguir. Si tiene varios mensajes, puede considerar colocarlos en un ListBox y hacer que el usuario haga doble clic en ellos para obtener la información completa que se debe mostrar.

Otros consejos

Sugiero ir con un enfoque no modal, como dijeron otros, pero un poco más específico:

  • Si solo desea una notificación, puede probar una punta de globo (TNA o la suya propia), o una ventana que sea como la notificación de correo de Outlook o la notificación que muestran muchos mensajeros instantáneos como Trillian.
  • Si solo desea darle al usuario la oportunidad de actuar, use un formulario no modal, pero recuerde que es muy posible que simplemente haga clic en él.
  • Si el usuario DEBE actuar sobre su mensaje, debe ir modal. Tenga en cuenta que la ventana del propietario todavía se pintará y puede actualizar su GUI: un diálogo modal, después de todo, tiene una bomba de mensajes, de lo contrario no funcionaría. Hice algo así recientemente, teníamos un grupo de subprocesos de trabajadores en segundo plano que realizaría cualquier acción y evento de disparo para que la GUI se actualizara, y un diálogo de espera modal que aún generaba mensajes. La ventana del propietario se actualizó con la acción de fondo como se esperaba.

¿Qué hay de agregar un NotifyIcon a su aplicación y mostrando una punta de globo . El inconveniente es que la notificación desaparecerá después de un corto tiempo, pero tal vez sea mejor para sus usuarios si no necesitan tomar medidas.

Solucionaría esto utilizando un cuadro de diálogo no modal o tal vez algunos consejos sobre herramientas, según los requisitos específicos.

Si no quiere que se bloquee, simplemente crearía su propio formulario simple para hacer la visualización. Así es como he completado elementos para clientes antes cuando se necesitaba una solución sin bloqueo. Pero tenga en cuenta que si lo hace sin bloqueo, los usuarios podrían obtener múltiples y sentirse abrumados si realmente están "deben actuar". escribir elementos.

gracias a todos los que contribuyeron con sugerencias, parece que mi solución fue correcta ;-)

mi solución fue un formulario base que proporcionaba botones OK y CANCEL para emitir eventos Completados y Cancelados; OK llamó a ValidateData virtual para la anulación de subclase. El formulario de llamada utilizaba propiedades para evitar recrear el formulario cada vez (el formulario estaba oculto en lugar de cerrado) y mantenía un diccionario de formularios activos para evitar que el mismo formulario se activara más de una vez. Parece un formulario modal, admite múltiples formularios emergentes a la vez, pero no ata el hilo principal de la GUI.

Si desea el aspecto del cuadro de mensaje, muéstrelo en un hilo de fondo.

ThreadPool.QueueUserWorkItem( (state) =>
    {
         MessageBox.Show("Your message");
    });

(código no probado)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top