2009-09-15 26 views
7

No quiero que el usuario interactúe con mi aplicación mientras un cierto backgroundworker está ocupado (trabajando). Creé este bgw para que la aplicación no parezca congelada cuando está funcionando. Pero ahora los usuarios pueden moverse en la aplicación. ¿Cómo desactivo mi formulario/aplicación?¿Deshabilitar formulario mientras BackgroundWorker está ocupado?

Gracias!

+1

Si vas a deshabilitar el formulario al mover el código al fondo, ¿qué sentido tiene moverlo al fondo? – JaredPar

+0

Porque sin un backgroundworker Windows dirá que la aplicación es "No responde" si el usuario intenta interactuar con ella. – Chris

Respuesta

14

¿Quizás establezca Enabled en false?

this.Enabled = false; 

Eso es un poco drástico, sin embargo, ya que también impide que el formulario se mueve, cambia de tamaño o evento cerrado. Un mejor enfoque sería poner un control Panel en su formulario, que tiene Dock = Fill, y poner nuestros otros controles en ese Panel. Luego, puede usar la propiedad Enabled del Panel para evitar que el usuario ingrese más datos.

Tenga en cuenta que el usuario será podrá cerrar el formulario, por lo que debe manejarse con gracia de alguna manera.

+1

Esta es una manera rápida y sucia de hacerlo, pero podría ser mejor (según su situación) que deshabilitar cada control en el formulario con el que el usuario puede interactuar. –

+0

@Michael: deshabilitar el formulario es realmente rápido y sucio: o) –

+0

Gracias, hice algo similar a lo que sugirió Michael. – Chris

0

Otra posible forma podría ser que "filtre" todas las entradas a la aplicación. Esto se puede hacer escuchando el "KeyDown" y "MouseButtonDown". Una vez que se desencadena el trabajo en segundo plano, puede establecer el indicador FILTER_INPUT en verdadero y reiniciarlo una vez hecho. Si se establece el indicador FILTER_INPUT, podría cancelar todos los eventos de tecla y mouse.

Esto puede no ser el más eficiente ya que todos los KeyPress y Clics van a ir a través de la comprobación de Filtro.

1

Estoy de acuerdo con @ michael-todd en su comentario anterior, deshabilitando controles individuales/botones de navegación/etc. mientras que el trabajador de base está trabajando parece una solución bastante buena. Esto le daría un control detallado sobre lo que el usuario puede hacer durante la operación de fondo específica.

Usted podría:

  1. Crear métodos para activar o desactivar todos los controles de navegación/interacción apropiadas (mediante el establecimiento de su propiedad Enabled en verdadero/falso, etc., según corresponda para cada control)
  2. la llamada " "método de su código correcto antes de llamar StartWorkerAsync() en su fondo trabajador
  3. en el controlador de eventos para RunWorkerCompleted, llame a la 'Desactivar método activar' para volver a habilitar la vista de la entrada del usuario
4

También puede crear un cuadro de diálogo modal de "ocupado" que se muestra cuando se inicia la tarea de fondo y se elimina mediante programación cuando finaliza la tarea. También podría poner una pequeña animación en esa casilla para que los usuarios sepan que algo está pasando. También deberá asegurarse de que no cierren el diálogo manualmente (solo permita que se cierre mediante programación).

+0

Esto puede ser un buen truco, especialmente cuando quieres que el Formulario Principal permanezca visible y sin cambios. Incluso puedes usar un DialogForm muy pequeño u oculto. –

+1

Otra cosa que he hecho es tener todo en el formulario contenido en un panel, luego ocultar el panel y poner un mensaje de "Ocupado". De esta manera no hay forma de interactuar con los controles subyacentes. –

1

Es más fácil de manejar deshabilitar ciertos controles colocándolos dentro de un panel y desactivación de ese panel en lugar de deshabilitar controles individuales:

controlPanel.Enabled = false; 

Una forma común para bloquear otras tareas, que pueden satisfacer sus necesidades, es mostrando una forma superior con una barra de progreso. Lo he implementado en el pasado con éxito. Otros programas hacen lo mismo.Por ejemplo, en WinRAR, cuando la aplicación está ocupada extrayendo o comprimiendo archivos, la aplicación muestra una forma superior. Parece una forma "modal", pero de hecho, puede hacer clic en las otras funciones, a lo que WinRAR pregunta: "¿Desea abortar la operación actual?"

Desactivar la aplicación completa a menudo no es necesario y puede no ser intuitivo. Por lo tanto, pregúntese si realmente necesita bloquear la interacción con el formulario. Por ejemplo, tengo una aplicación que toma cierto tiempo para completar ciertas tareas. Proporciono un indicador de barra de progreso para ese trabajo en particular, pero aún puede interactuar con la aplicación para iniciar tareas adicionales que se ejecutan simultáneamente. Incluso si solo le permitiera realizar una única tarea a la vez, igual puede querer ver el archivo de ayuda o establecer las preferencias de la aplicación mientras se ejecuta la tarea. Además, le doy al usuario un botón que le permite detener la tarea. Deshabilitar el formulario evitaría este tipo de interacción.

Cuestiones relacionadas