2010-09-18 20 views
13

Tengo un problema. Necesito esconder mi ventana a la carga de la ventana. Perothis.Visible no funciona en Windows Forms

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

no funciona. Y la propiedad Visible sigue siendo verdadera. ¿Me estoy perdiendo de algo?

Respuesta

30

Sí, la propiedad Visible es un gran problema en Windows Forms, eso es lo que realmente hace que se cree el identificador y hace que se ejecute OnLoad(). En otras palabras, la ventana no existe hasta que se vuelva visible. Ignorará los intentos de deshacer esto.

Es bastante común querer crear el identificador pero no hacer visible la ventana si usa NotifyIcon. Esto se puede conseguir por SetVisibleCore anulando:

protected override void SetVisibleCore(bool value) { 
     if (!this.IsHandleCreated) { 
      value = false; 
      CreateHandle(); 
     } 
     base.SetVisibleCore(value); 
    } 

Mira que OnLoad todavía no se ejecutará hasta que la ventana consigue realmente visible para mover el código en el constructor si es necesario. Simplemente llame a Show() en el controlador de eventos del menú contextual NotifyIcon para hacer que la ventana sea visible.

-2

Utilice this.Hide() para ocultar su ventana. this.Close() para cerrar

+0

bien. pero, ¿qué hay de malo con lo visible? – Barun

+1

this.Hide no funcionará dentro del evento _Load –

1

Creo que esto se debe a que la ventana no existe hasta después de este evento. El mejor lugar para hacer esto está fuera de la forma:

if (x == 1) 
{ 
    form1.ShowForm(); 
} 
else 
{ 
    // Don't show the form 
} 

Si realmente necesidad de hacerlo dentro de la forma en sí misma, entonces creo que es necesario utilizar el evento activado.

EDIT:

También podría intentar algo como:

static void Main() 
    { 
     Application.EnableVisualStyles(); 
     Application.SetCompatibleTextRenderingDefault(false); 

     Form1 myform = new Form1(); 
     if (myform.CheckStuff()) 
     { 
      Application.Run(myform); 
     } 
    } 
+0

Lo probé. Pero antes ocultarlo apareciendo y luego desapareciendo. Y no lo quiero – Barun

+0

Luego, creo que debe hacer los controles que tenga antes de mostrar el formulario. Nota: incluso si esta es su forma principal, puede usar la función Principal() para hacer esta comprobación. –

+0

Pero necesito esto de esconderme y correr y no puedo hacer mis cosas antes de iniciarlo. – Barun

2

creo que no es buena idea establecer la visibilidad desde el evento Load del formulario. En su lugar, lo haría por añadir un método público:

public void LoadForm(...) 
{ 
    // do the all the initializations 
} 

y llame al método para cargar el formulario. La forma debe ser no visible a menos que muestran de forma explícita:

MyForm instance = new MyForm(); 
instance.LoadForm(...); 
// instance.Show(); or ShowDialog() for dialog form not sure exactly the syntax. 
+0

Pero esta es mi forma principal, ¿cómo puedo controlarlo con esta sintaxis? – Barun

4

parece que se puede utilizar lo siguiente:

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

Acabo de prueba en una aplicación Windows Forms y funcionó.

(también acaba de encontrar esto: Single Form Hide on Startup

2

poner su llamada en el bucle de eventos de Windows como esto:.

WindowsFormsSynchronizationContext.Current.Post((obj) => this.Hide(), null); 

Así Hide() se invocará más tarde, por lo tanto, arreglar el problema

-2

llamada Ocultar() en el evento de muestra, Ocultar() sólo establece visible a falso, y antes de que se está mostrando la forma de la propiedad Visible es falsa ya ...