Frage

Ich ändere die Sichtbarkeit eines Formulars auf false während des Ladeereignis und der Form nach wie vor zeigt sich. Was ist das richtige Ereignis this.Visible = false zu binden; zu? Ich möchte das Form1 instanziiert, ohne es zu zeigen.

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;
        }

    }
}
War es hilfreich?

Lösung

Unabhängig davon, wie viel Sie versuchen, die Visible-Eigenschaft festlegen, bevor das Formular angezeigt wurde, wird es knallen. Wie ich es verstehe, ist dies, weil es das Mainform des aktuellen Application ist. Eine Möglichkeit, das Formular automatisch geladen werden, zeigt aber nicht beim Start der Anwendung ist das Hauptverfahren zu ändern. Standardmäßig sieht es so etwas wie dieses (.NET 2.0 VS2005):

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

Wenn Sie stattdessen so etwas wie dies tun, wird die Anwendung starten, laden Sie Ihre Form und laufen, aber das Formular wird nicht angezeigt:

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

}

Ich bin nicht ganz sicher, wie das ist nützlich, aber ich hoffe, Sie wissen, dass; o)

Update: Es scheint, dass Sie die Visible-Eigenschaft auf False nicht festlegen müssen, oder eine Instanz Application liefern (das wird automatisch für Sie erstellt werden „unter der Haube“). Verkürzte den Code entsprechend.

Andere Tipps

Ich weiß, dass dies eine alte Frage, aber ich stolperte über sie und bin ziemlich überrascht, niemand SetVisibleCore :

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

In diesem Code-Schnipsel, solange isVisibleCore falsch bleibt, wird das Formular unsichtbar bleiben. Wenn es auf false gesetzt ist, wenn das Formular instanziiert wird, werden Sie nicht, dass kurzes Aufblitzen Sichtbarkeit erhalten, die Sie erhalten würden, wenn Sie Visible = false in der gezeigten Veranstaltung.

Es dauerte einige Zeit, eine ordnungsgemäß funktionierende Lösung zu finden.

Stellen Sie die Eigenschaften mit dem Namen Window zu Minimized und ShowInTaskbar auf False unter Eigenschaftenfenster. Sobald Ihr Formular vollständig geladen ist, ruft unten Zeilen Code.

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

PS: Diese Lösung auf Visual C # 2008 Express Edition Geprüft wird

Nur eine Instanz von Form1 erstellen und rufen Sie nicht Methoden, es zu zeigen / anzuzeigen. Aber ich wette, Sie etwas falsch zu machen.

Wie wäre es die Opacity-Eigenschaft auf 0 auf Design setzen und zurück zu 100, wenn Sie das Formular anzeigen?

eine Lösung, die ich leben kann, mit so wird das Formular erstellt und on_load auf createtion genannt. set Window zu minimieren dann auf Last auf false und Window normal sichtbar gesetzt

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

, was nicht funktioniert hat:

die SetVisibleCore Überschreibung Lösung nicht das Formular erstellt

als auch die

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

):

Versuchen Sie, auf dem Visible Ereignisse.

Das gezeigte Ereignis können Sie wollen Sie wollen. Obwohl die Form wird „Blitz“ für eine Sekunde, bevor versteckt.

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

Was würde ich wäre das Formular auf einer Veranstaltung die steht vor dem _Show Ereignisse, wie der Konstruktor nach dem IntializeComponent () Aufruf instanziiert.

Wenn dies Ihr Hauptformular ist, kann es nicht zu einem besseren Ort sein dann das Gezeigte Ereignis. Aber in diesem Fall werden Sie Flimmern erhalten.

Ich kann nicht einen guten Platz findet aus zeigt zumindest schnell eine laufende Hauptform zu stoppen. Selbst ein Timer in dem Ladeereignis aktiviert wird es nicht tun.

Wenn es eine sekundäre Form schaffen es nur aber zeigen sie nicht.

Für eine flimmerfreie Gezeigte Lösung, stellte auch die Lage der Form Off-Screen beim Laden:

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;
}

Haben Sie versucht,

this.Hide();

in den form_load oder form_activated Ereignissen

Stellen Sie die Sichtbarkeit auf den Konstruktor, nach init und dann this.Show () später

InitializeComponent () setzt this.Visible = true, da Sie angegeben haben, dass das Formular im Designer sichtbar sein soll (oder standardmäßig auf das). Sie sollten in dem Designer Visible auf false gesetzt, und es wird nicht von InitializeComponent () aufgerufen werden. Sie können es dann sichtbar machen, wann immer Sie mögen.

.Visible = false oder Hide() im Load Ereignisse zu haben bewirkt, dass das Formular kurz zeigen, wie es der Zeit zwischen, wenn es wird physisch sichtbar, und wenn das Load Ereignis wird ausgelöst, trotz der Tatsache, dass die Dokumentation sagt das Gegenteil.

Rufst du Show() oder ShowDialog() irgendwo? Ich bin mir nicht sicher, ob dieses Verhalten noch vorhanden ist, aber zumindest in früheren Versionen des Frameworks ein Aufruf an ShowDialog() auslöste nicht das Load Ereignis, so vielleicht ist das Ihr Problem (obwohl ich ShowDialog() denken rufe dann eine modale Form versteckt würde sein eine schlechte Praxis!)

Wenn Sie den Griff erstellt haben (und die Griffe für Kontrollen) für was auch immer es ist, Sie versuchen, eine bessere Idee zu tun, wäre die StartLocation einstellen Manual, stellen Sie dann die Position Eigenschaft auf eine Off-Screen-Position . Dies wird erstellen und die Form zeigen, während es für den Benutzer unsichtbar zu machen.

Ja das wirklich eine elegante Weise, in der Perspektive, um Ihren Code als Ihre Anwendungen visuell ist das Formular flackern durch im Konstruktor / Load-Ereignisse versteckt.

Ich bin damit einverstanden, dass dies wirklich unerträglich sein kann, weil WinForms in der Regel nicht hübsch aussehen zu tun, während sie eine Reihe von Kontrollen oder bevölkern einen großen Datagridview oder was auch immer sind initialisiert. Noch tun Sie das Fenster-Handle müssen vorhanden sein, bevor Sie das tun können, alle Probleme zu schaffen, die genannt wurden.

Hier ist etwas, das für mich gearbeitet hat, und Sie haben zwei Möglichkeiten: Sie können nur Ihr Hauptformular verstecken, bis es fertig ist, oder Sie können eine Art von wenig Splash-Screen zeigen Sie Ihre Benutzer zu informieren, dass Sie daran arbeiten . Genießen Sie.

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();      
    }
}

Ich habe diese drei Eigenschaftseinstellungen für das Formular:

ShowInTaskbar = false
ShowIcon = false
WindowState = Minimized
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top