2012-06-05 11 views
8

Uso de formularios Windows Forms, Si estoy en un hilo que no es el hilo "principal" ui puedo safetlyCrear un formulario y el uso de Form.ShowDialog en un subproceso de fondo

  1. crear un formulario,
  2. llamada ShowDialog en ese formulario

parece que estaría obedeciendo la regla de:. controles Winforms debe ser modificado en el hilo que fueron creados en

De alguna de las lecturas que he hecho parece que ShowDialog creará su propia bomba de mensajes para que no tenga que preocuparme de que el Formulario se esté creando en un hilo que ya tiene una bomba de mensajes.

El trasfondo de la pregunta es que recibo una devolución de llamada donde me gustaría mostrar alguna UI de Winforms, pero no tengo acceso a ninguna otra IU que pueda usar para invocar al hilo principal.

+0

+1 esta fue una gran pregunta. –

Respuesta

7

Eso es más o menos correcto, aunque es muy importante que llame al método SetApartmentState() del subproceso para cambiar el subproceso a STA. Importante para muchas operaciones de UI, incluido el portapapeles, arrastrar y soltar y los cuadros de diálogo del shell. Y que generalmente tiene un problema grave de orden Z cuando el formulario que crea en el hilo no está en primer plano y se esconde detrás de otra ventana. O tiene el desagradable hábito de realmente hacer moverse en primer plano cuando el usuario no lo espera y tomar un clic del mouse o una pulsación de tecla inesperadamente.

Estos son problemas difíciles de corregir, hacen que su aplicación sea escamosa. No hay una buena razón para no tener una referencia para invocar, también puedes pasarla a la clase de alguna manera. Siempre tienes Application.OpenForms [0] para recurrir, si es realmente necesario.

+0

Gracias Hans. ¿Alguna desventaja para usar Application.OpenForms [0]? ¿Siempre se garantiza que existe? –

+1

@MattSmith: Debería ser, sí, pero encontré [esta publicación de SO] (http://stackoverflow.com/questions/3751554/application-openforms-count-0-always) detallando un error, no estoy seguro de si eso todavía existe. –

+1

Todavía existe, fácil de evitar sin embargo. –

2

Sí, puede hacerlo, pero si desea que el diálogo realmente actúe como un diálogo modal (es decir, bloquear la ventana principal, que supongo que desea desde que llama al ShowDialog), prepárese para sentirse decepcionado.

¿Qué problema estás tratando de resolver aquí? Parece que quieres un diálogo modal que no se bloquee, lo cual es un poco extraño. Si explica el problema en cuestión, puede existir una solución que aún no haya considerado.

+0

Buen punto. En mi caso, recibo una devolución de llamada y es posible que muestre ui ui otra vez en ese momento. No tengo ninguna razón para no estar en el hilo principal de la interfaz de usuario, simplemente no tenía un control que pudiera usar para invocar. –

Cuestiones relacionadas