2008-09-15 28 views
9

Versión corta: Deseo activar el evento Form_Load() sin hacer que el formulario sea visible. Esto no funcionará porque Show() ignora el valor actual de la propiedad visible:Cargue un formulario sin mostrarlo

tasksForm.Visible = false; 
tasksForm.Show(); 

Versión larga: Tengo una aplicación Windows Forms con dos formas: principal y tareas. La forma principal siempre se muestra. El usuario puede hacer clic en un botón para abrir el formulario de tareas o hacer clic en algunos botones que solo ejecutan una tarea directamente sin abrir el formulario de tareas.

Cuando un usuario solicita ejecutar una tarea directamente, me gustaría simplemente llamar a algunos métodos públicos en el formulario de tareas sin mostrarlo. Desafortunadamente, la lógica de la tarea depende de las cosas que suceden en el evento Form_Load(). La única forma que puedo encontrar para desencadenar Form_Load() es llamar a Show(). El mejor que he podido hacer es mostrar la forma en el estado minimizado:

tasksForm.WindowState = FormWindowState.Minimized; 
tasksForm.Show(); 

supongo que la solución más limpia sería para tirar de la lógica de las tareas de la forma y tareas en una clase controlador. Entonces puedo usar esa clase desde el formulario principal y desde el formulario de tareas, y solo cargo el formulario de tareas cuando lo necesito para el usuario. Sin embargo, si es fácil cargar el formulario sin mostrarlo, sería un cambio menor.

+0

Lo aliento a que vaya con la solución más limpia. Será más fácil para usted mantenerlo más adelante. –

+0

Como ya he dicho en mi respuesta y estoy de acuerdo con Scott, debe volver a trabajar esto y seguir la ruta de la clase de controlador. Es una buena práctica. –

Respuesta

7

Estoy totalmente de acuerdo con Rich B, tiene que ver dónde está ubicando la lógica de su aplicación en lugar de intentar sacudir los mecanismos de WinForms. Todas esas operaciones y datos que tus Tareas forman están exponiendo realmente deberían ser en una clase separada decir algún tipo de Controlador de Aplicación o algo contenido en tu formulario principal y luego usado por tu formulario de tareas para leer y mostrar datos cuando sea necesario pero no lo hace necesita una forma para ser instanciado para existir.

Probablemente parece un dolor para volver a trabajar, pero podrás mejorar la estructura de la aplicación y lo que es más fácil de mantener, etc.

+1

* suspiro * OK, estaré bien. Gracias por los comentarios, todos. –

9

Me parece que necesita sentarse y volver a pensar su enfoque aquí. No puedo imaginar una sola razón por la que tus métodos públicos tengan que estar en una forma si no lo vas a mostrar. Solo crea una nueva clase.

+0

Para extrapolar en su punto, tenga la clase de Modelo para la Tarea, y la clase de Vista/Controlador que es el Formulario de Tarea. – user7116

+0

@sixlettervariables: ¿Por qué necesitaría una vista? Dijo que no iba a cargar el formulario de todos modos. Parece que solo necesita una clase. – GEOCHET

+0

Me perdí la parte donde ni siquiera iba a ver los datos. Una especie de pregunta no inicial si esa es la única pregunta ... – user7116

0

Si hace que el método sea público, puede acceder directamente ... sin embargo, podría haber algunos efectos secundarios inesperados al llamarlo. Pero hacerlo público y llamarlo directamente no dibujará la pantalla ni abrirá el formulario.

0

Mueva el código de inicialización obligatorio para la clase de formulario fuera del controlador de eventos Load en el constructor. Para una clase Form, instanciación de una instancia (a través del constructor), la carga de formularios y la visibilidad de formularios son tres cosas diferentes, y no es necesario que sucedan al mismo tiempo (aunque es obvio que deben suceder en ese orden).

4

De MSDN:

Form.Load
Ocurre antes de que se muestre un formulario por primera vez.

Lo único que causaría que se cargue la forma, es cuando se muestra.
Form.Show(); y Form.Visible = true; son exactamente lo mismo. Básicamente, detrás de las escenas, muestra verificaciones de varias condiciones y luego establece Visible en verdadero. Entonces, obviamente, establecer visible a falso (que ya es) antes de mostrar el formulario no tiene sentido.

Pero olvide los tecnicismos. Estoy totalmente de acuerdo con Rich B y Shaun Austin: la lógica no debería estar en esa forma de todos modos.

11

Quizás debe tenerse en cuenta que puede hacer que se cree la ventana del formulario sin mostrar el formulario. Creo que podría haber situaciones legítimas para querer hacer esto.

De todos modos, el buen diseño o no, que puede hacer que de esta manera:

MyForm f = new MyForm(); 
IntPtr dummy = f.Handle; // forces the form Control to be created 

No creo que esto hará que Form_Load() para ser llamado, pero usted será capaz de llamar f.Invoke() en este punto (que es lo que estaba tratando de hacer cuando tropecé con esta pregunta TAN).

+0

Esta respuesta me ayudó MUCHO. – Kelsie

+0

una razón es mantener la aplicación en ejecución, como un servicio –

1

A veces esto sería útil sin que sea un mal diseño. A veces puede ser el comienzo de una migración de nativo a administrado.

Si está migrando una aplicación de C++ a .NET, por ejemplo, simplemente puede hacer que su aplicación sea una ventana secundaria del formulario o panel .NET y migrar gradualmente a .NET eliminando el menú de la aplicación C++ , barra de estado, barra de herramientas y mapeo de .NEt a su aplicación utilizando la invocación de plataforma, etc ...

Su aplicación C++ puede tardar un tiempo en cargarse, pero el formulario .NET no ... en el que puede querer para ocultar el formulario .NEt hasta que su aplicación C++ se haya inicializado.

Establecería opacity = 0 y visible = false en false después de llamar a show, luego cuando se cargue su aplicación C++, luego se invertirá.

Cuestiones relacionadas