2010-09-22 6 views
8

ho voluto nascondere la finestra principale del mio app all'avvio, così ho messo questo nel costruttore:Nascondere i moduli all'avvio: perché non this.Hide() nasconde il mio modulo?

this.Hide(); 

Questo non nasconde però la mia forma. Sembra che posso ottenere solo i pulsanti per nascondere il modulo. Sto facendo qualcosa di sbagliato qui?

+0

possibile duplicato del [this.Visible non funziona in Windows Form] (http: // StackOverflow. it/questions/3742709/forms-visible-is-not-working-in-windows) –

risposta

20

è possibile utilizzare questa riga di codice. E 'abitudine nasconderlo, ma sarà ridotto al minimo:

this.WindowState = FormWindowState.Minimized; 

Inoltre, se non si desidera mostrare sulla barra delle applicazioni o, è possibile aggiungere questa riga:

this.ShowInTaskbar = false; 

Ma perché crei il modulo se non vuoi che sia visibile in primo luogo?

+0

Perché inizierà con Windows e risiederà nella barra delle applicazioni in modo simile al software antivirus e firewall. Qualche idea sul perché 'this.Hide()' in realtà non nasconde il modulo quando viene chiamato dal costruttore del form? – Pieter

+1

Penso che questo sia perché a questo punto (quando si esegue il costruttore) il tuo modulo non è stato ancora reso visibile. Solo dopo aver completato il costruttore, il modulo verrà creato e reso visibile. Quindi il tuo unico problema perché questo non funziona è perché è fatto dal costruttore. Non suggerisco questa soluzione come soluzione, ma come esperimento, creare un timer e avviarlo dal costruttore con un ritardo di 1 secondo e fare in modo che il metodo timer_tick nasconda il modulo. Questo funzionerà, dal momento che al momento si chiama this.Hide() il modulo sarà visibile. –

+0

Si ottiene lo stesso problema quando si ha un costrutto come questo in program.cs: Application.Run (new Form1()); e si tenta di scrivere Application.Exit() nel costruttore di Form1. Dopo la chiamata Application.Exit() la tua applicazione sarà ancora viva e vegeta, e questo perché il costruttore viene eseguito prima di Application.Run e quindi non avrà alcun effetto. Quindi lo stesso problema per te. Lo fai Nascosto, solo per avere Application.Run renderlo vivibile e dare di nuovo calci. –

0

Provare a impostare la proprietà visible del modulo su false prima che venga caricata nel punto di ingresso principale dell'applicazione.

Form1 obj = new Form1(); 
obj.visible = false; 
Application.Run(obj); 

Oppure provare a impostare le coordinate della forma a posizione superiore come 9000, 9000.

+0

Questa non è una soluzione. È necessario utilizzare l'override di OnVisibleChanged. Vedi sopra. –

+0

Non mettere il modulo fuori dallo schermo ma ancora visibile. Gli utenti non vedenti che usano il software screen reader lo "vedono" ancora (così come gli utenti che usano alt-tab). –

11

Proprio l'override del metodo OnVisibleChanged e modificare la visibilità della forma in là, qualcosa di simile:

protected override void OnVisibleChanged(EventArgs e) 
{ 
    base.OnVisibleChanged(e); 
    this.Visible = false; 
} 

E questo è tutto! Semplice e pulito.

+0

Questa è una soluzione funzionante. Chiama sul modulo Nascondi() e posiziona sopra il codice. Grazie :) –

+0

Questa è l'unica soluzione che ha funzionato per me. – tavlima

0

Ho provato a farlo impostando Visible su false o hiding nel costruttore e nell'evento OnLoad.

Nessuno di questi ha avuto alcun effetto, poiché il modulo è impostato su Visibile dopo la creazione del modulo e dopo l'attivazione dell'evento OnLoad, in SetVisibleCore.

L'impostazione del modulo nascosto nell'evento Mostrato funziona, ma il modulo sfarfalla sullo schermo per un momento.

È anche possibile eseguire l'override di SetVisibleCore e impostare il valore su falso, ma OnLoad non viene attivato e alcuni degli altri eventi sono incasinati, come la chiusura del modulo.

La soluzione migliore a mio parere è impostare il modulo su Ridotto e non mostrato nella barra delle applicazioni prima di chiamare Application.Run().

Così, invece di:

Application.Run(new MainForm()); 

fare:

MainForm form = new MainForm(); 
form.WindowState = FormWindowState.Minimized; 
form.ShowInTaskbar = false; 

Application.Run(form); 

Poi l'applicazione verrà eseguita con tutti gli eventi appropriati sparato (anche OnShown) e non verrà visualizzato il modulo.

Se si desidera essere in grado di nascondere/mostrare il modulo come normale dopo, è necessario impostare WindowState e ShowInTaskbar su Normal e true.

Nell'evento Mostrato, è possibile riportare ShownInTaskbar su true e nascondere correttamente il modulo.

this.Shown += new System.EventHandler(this.MainFormShown); 

...

void MainFormShown(object sender, EventArgs e) 
{ 
    this.ShowInTaskbar = true; 
    this.Visible = false; 
} 

Impostazioni il WindowState di nuovo al normale, mentre la forma è nascosta non ha alcun effetto, quindi sarà necessario per farlo dopo si mostra ancora una volta la forma, altrimenti l'icona essere nella barra delle applicazioni ma il modulo verrà ridotto a icona.

this.Show(); 
this.WindowState = FormWindowState.Normal; 
+0

La soluzione di lavoro è sopra. Questo non funzionerà. –

+0

La soluzione di soluzione di lavoro di cui sopra non ha funzionato per me. Ha causato momentaneamente il tremolio dello schermo sullo schermo prima di essere nascosto. Inoltre impedisce di mostrare il modulo in seguito. Questo metodo ha funzionato bene per me. –

3

Se si preferisce utilizzare this.Hide o this.Show si può fare questo

protected override void OnShown(EventArgs e) 
{ 
    base.OnShown(e); 
    this.Hide(); 
} 
Problemi correlati