2009-04-30 22 views
22

Estoy cambiando la visibilidad de un formulario a falso durante el evento de carga Y el formulario aún se muestra. ¿Cuál es el evento correcto para vincular esto? Visible = falso; ¿a? Me gustaría crear una instancia de Form1 sin mostrarlo.C# /. NET - WinForms - Crear una instancia de un formulario sin mostrarlo

using System; 
using System.Windows.Forms; 

namespace TestClient 
{ 
    public partial class Form1 : Form 
    { 
     public Form1() 
     { 
      InitializeComponent(); 
     } 

     private void Form1_Load(object sender, EventArgs e) 
     { 
      this.Visible = false; 
     } 

    } 
} 
+4

Estoy desconcertado por cuantas personas dieron respuestas en este hilo sin verificar los resultados. Esconder(); Visible = falso; ninguna de estas cosas funciona en este escenario. No es como otras formas, es la forma PRINCIPAL, y se mostrará sin importar lo que hagas. La gente aquí necesita pensar antes de dar respuestas falsas. Y por cierto, no hay propiedad Visible para el formulario principal en Visual Studio 2010. Simplemente no está allí en absoluto. –

+0

@ Draek, buen punto. Pero puede lograr una funcionalidad similar usando una combinación de propiedades llamada ShowInTaskbar y WindowState. Lo agregué como una respuesta. –

Respuesta

22

Independientemente de cuánto intente establecer la propiedad Visible antes de que se muestre el formulario, aparecerá. Según tengo entendido, esto se debe a que es el MainForm del ApplicationContext actual. Una forma de que el formulario se cargue automáticamente, pero no se muestre al inicio de la aplicación, es alterar el método Principal. Por defecto, se ve algo así (.NET 2.0 VS2005):

[STAThread] 
static void Main() 
{ 
    Application.EnableVisualStyles(); 
    Application.SetCompatibleTextRenderingDefault(false); 
    Application.Run(new Form1()); 
} 

Si en lugar de hacer algo como esto, la aplicación se iniciará, cargar su forma y correr, pero la forma no se mostrará:

[STAThread] 
static void Main() 
{ 
    Application.EnableVisualStyles(); 
    Application.SetCompatibleTextRenderingDefault(false); 
    Form1 f = new Form1(); 
    Application.Run();   

} 

no estoy del todo seguro de cómo esto es útil, pero espero que lo sepa; o)

Actualización: parece que no necesita establecer la propiedad Visible como falsa, o proporcionar una instancia de ApplicationContext (que se creará automáticamente para usted "debajo del capucha"). Acorté el código en consecuencia.

+0

+1 buena idea. Gotcha. Parece que es la aplicación. Ejecutar es el culpable. – BuddyJoe

+0

Sí, por curiosidad, verifiqué qué ocurre debajo del capó, y ApplicationContext establecerá Visible = verdadero en MainForm, si hay alguno. Si llama a Application.Run con una instancia de formulario como entrada, se crea un nuevo ApplicationContext que obtiene el formulario asignado a la propiedad MainForm. –

+1

El problema con esta solución es que cerrar el formulario no cierra la aplicación. Por lo tanto, debe compensar llamando a Application.Exit() en FormClose. A menos que, por supuesto, su aplicación use más de un formulario, en cuyo caso deberá ser un poco más inteligente. Afortunadamente, el mío solo usa un formulario y un icono de bandeja del sistema, por lo que el ejemplo anterior funciona bien. –

2

Hay que crear una instancia de Form1 y no llaman métodos para mostrar/visualizarlo. Pero apuesto a que estás haciendo algo mal.

0

Ha intentado

this.Hide(); 

en los form_load o form_activated eventos

+0

Solo para su información, esto no funciona cuando se utiliza en el evento form_load, pero funciona en el evento form_activated, aunque muestra el formulario durante una fracción de segundo antes de ocultarse. – CraigTP

1

probar en el caso VisibleChanged.

+0

Voy a intentar eso. – BuddyJoe

1

Lo que sugeriría sería crear una instancia del formulario en un evento que preceda al evento _Show, como el constructor, después de la llamada a IntializeComponent().

+0

Creo que quizás quisiste decir ocultar en lugar de crear instancias, ¿correcto? En cualquier caso (sin juego de palabras), debe asegurarse de que donde sea que llame tenga lugar DESPUÉS de la llamada que hace que el formulario sea visible, pero antes de que realmente se HAGA visible. –

+0

En realidad, sugerí un enfoque para inicializar lo que sea necesario antes de mostrar el formulario. –

+0

Intenté eso. Eso no funcionó. – BuddyJoe

0

Conjunto del visibilidad en el constructor, después de init y luego this.Show() más tarde

1

El evento se muestra puede darle lo que desea. Aunque la forma "parpadeará" por un segundo antes de ocultarse.

private void Form1_Shown(object sender, EventArgs e) 
    { 
     this.Visible = false; 
    } 
0

InitializeComponent() es establecer this.Visible = true, ya que ha especificado que la forma debe ser visible en el diseñador (o por defecto en eso). Debe establecer Visible en falso en el diseñador, y InitializeComponent() no lo llamará. Luego puede hacer que sea visible cuando lo desee.

0

Tener .Visible = false o Hide() en caso Load hará que su forma de mostrar brevemente, ya que es el tiempo entre el momento en que se vuelve físicamente visible y cuando el evento Load es despedido, a pesar del hecho de que la documentación dice lo contrario.

¿Está llamando a Show() o ShowDialog()? No estoy seguro de si este comportamiento aún está presente, pero al menos en versiones anteriores del marco una llamada a ShowDialog() no desencadenó el evento Load, por lo que tal vez ese sea su problema (aunque creo que llamar a ShowDialog() y ocultar un formulario modal ¡sea una mala práctica!)

Si tiene que tener el asa creada (y los controladores para los controles) para lo que sea que esté tratando de hacer, una mejor idea sería establecer el StartLocation en Manual, luego establecer la propiedad Position a una ubicación fuera de pantalla. Esto creará y mostrará el formulario, mientras lo hace invisible para el usuario.

1

Si esta es su forma principal, puede que no haya un lugar mejor que el evento Mostrado. Pero en ese caso obtendrás parpadeo.

No pude encontrar un buen lugar para detener la ejecución de un formulario principal que se muestra al menos rápidamente. Incluso un temporizador activado en el evento de carga no lo hará.

Si es una forma secundaria, solo créela pero no la muestre.

0

Sí, la manera más elegante en perspectiva para su código que su visual de aplicaciones es parpadear el formulario ocultándose en el evento constructor/load.

10

Me tomó algo de tiempo encontrar una solución que funcione correctamente.

Establezca las propiedades llamadas WindowState en Minimized y ShowInTaskbar en False en la ventana de propiedades. Una vez que su formulario esté completamente cargado, llame a las líneas de código a continuación.

 this.ShowInTaskbar = true; 
     this.WindowState = System.Windows.Forms.FormWindowState.Maximized; 
     //this.WindowState = System.Windows.Forms.FormWindowState.Normal; 

PD: Esta solución se prueba en Visual C# 2008 Express Edition

11

Sé que esto es una vieja pregunta, pero yo sólo tropezó con ella y estoy bastante sorprendido de que nadie ha mencionado SetVisibleCore:

bool isVisibleCore = false; 
protected override void SetVisibleCore(bool value) 
{ 
    base.SetVisibleCore(isVisibleCore); 
} 

En ese fragmento de código, siempre que isVisibleCore permanezca en falso, el formulario permanecerá invisible. Si se configura como falso cuando se crea una instancia del formulario, no obtendrá ese breve destello de visibilidad que obtendría si configura Visible = false en el evento Mostrado.

+0

esto no creó el formulario –

+0

cuando he creado el formulario fuera de application.run y no formulé el formulario.espectáculo(); (probablemente tenga eventos para crear componentes en el primer show). por lo que los componentes en el formulario no se crearon completamente. y cuando intenté interactuar con ellos, obtuve un componente de error que no se inicializó. el mismo error fue cuando eliminé el valor de setvisible o configuré el formulario como invisible al principio. –

+0

lo que funcionó es crear el formulario y mostrarlo con el estado de la ventana minimizado y solo luego ocultarlo y establecer el estado de Windows en normal. (esta vez se activó el evento onload) después de que el clic de trayicon tuviera que configurar la altura y el ancho superior izquierdo en cualquiera de ellos fue incorrecto como -32000 –

2

¿Qué le parece si configura la propiedad Opacidad en 0 en el diseño y vuelve a 100 cuando desea mostrar el formulario?

+1

¿Has probado esto? – poplitea

+1

Con este enfoque, el formulario seguirá estando accesible si el usuario usa alt + tab. –

2

una solución puedo vivir con por lo que se crea el formulario y se invoca on_load en la creación. conjunto WindowState para minimizar luego en la carga establece visible a falso y windowstate a la normalidad

private void Form1_Load(object sender, EventArgs e) 
{ 
     this.Visible = false; 
     this.WindowState = FormWindowState.Normal; 
} 

lo que no funcionó:

la solución override SetVisibleCore no crea el formulario

como también la

Application { 
Form1 f = new Form1(); 
Application.Run(); 

):

1

Para una solución de muestra libre de parpadeo, ajuste también la ubicación del formulario fuera de la pantalla durante la carga:

private Point startuplocation; 

private void Form1_Load(object sender, EventArgs e) 
{ 
    this.startuplocation = this.Location; 
    this.Location = new Point(-1000, -1000); 
} 

private void Form1_Shown(object sender, EventArgs e) //fires first time shown 
{ 
    this.Visible = false; 
    this.Location = this.startuplocation; 
} 
0

Estoy de acuerdo que esto puede ser muy irritante, porque Winforms por lo general no se ven bastante mientras se está inicializando una un montón de controles o llenar una gran DataGridView o lo que sea. Aún necesita el identificador de ventana para existir antes de que pueda hacer eso, creando todos los problemas que se han mencionado.

Esto es algo que me ha funcionado, y tiene dos opciones: Puede ocultar su formulario principal hasta que esté listo, o puede mostrar una especie de pequeña pantalla de presentación para que su usuario sepa que está trabajando en eso. Disfrutar.

public partial class MainForm : Form 
{ 
    public MainForm() 
    { 
     InitializeComponent(); 
    } 
    Size mDeferredSize; 
    protected override void OnHandleCreated(EventArgs e) 
    { 
     // Capture the "real" size... 
     mDeferredSize = Size; 
     // and set it to nothing... 
     Size = new Size(0, 0); 
     DoSomeUglyInitialization(showOptionalSplash: true); 
     Size = mDeferredSize; // ...and now put it back to the original size  
     base.OnHandleCreated(e); 
    } 
    private void DoSomeUglyInitialization(bool showOptionalSplash) 
    { 
     MySplash splash = null; 
     if (showOptionalSplash) 
     { 
      // We have made some borderless form class with a logo or something... 
      splash = new MySplash(); 
      splash.Show(); 
     } 
     // vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv 
     // Initialization that REQUIRES A HANDLE, e,g, 
     // we might be creating a bunch of controls, or 
     // populating a big DataGridView. Whatever it is, 
     // we don't want everyone looking at our biz. 
     System.Threading.Thread.Sleep(2500); // (Here simulated...) 
     // ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 
     splash?.Dispose();  
    } 
} 
Cuestiones relacionadas