Autor Beitrag
Talemantros
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 444
Erhaltene Danke: 2

Win7 Proff 64bit
C# (VS2013)
BeitragVerfasst: So 09.03.14 12:00 
Hallo zusammen,
nachdem ich nun einige Zeit geübt und gelesen habe und kleinere Sachen gebaut habe würde ich mich gern an ein größeres Projekt setzen.
Wenn ich konkret was umsetzen will finde ich lernt man besser wie nur aus Büchern etc.

Als erstes soll meine Anwendung einen Splashscreen bekommen, der je nach länge der Dauer, die das Hauptform zum Laden benötigt gezeigt wird.

Nun habe ich einige Ansätze im Netz gefunden, die aber mein momentanes Verständnis noch weit überschreiten und einfach abtippen wollte ich nicht.

Weiterhin hatte ich folgendes in einem anderen Forum gefunden

Kopierter Text:

1. Lass den Splash starten
2. Instanziere dein Hauptform, setze es vorher im designer auf visible = false;
3. Mach ein Eventhandler auf VisibleChanged des Hauptforms.
4. Am Ende deines Form-Konstruktors setzt du visible auf true;
5. Im Eventhandler deregistrierst du den eventhandler selber( -= ),schließt den Splash-Screen und fertig.

Was muss ich mir unter 3 und 5 vorstellen?
Ich fand der Ansatz, auch wenn ich ihn noch nicht verstehe, klang noch am einfachsten im Gegensatz zu den anderen mit BackgroundWorker etc.

Vielen Dank
und schönes sonniges Wochenende

Gruß
Daniel
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4798
Erhaltene Danke: 1059

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: So 09.03.14 17:47 
Hallo,

gemeint ist wohl:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
{
  // im Form-Konstruktor
  VisibleChanged += Form_VisibleChanged; //  bzw. direkt im Designer
  Visible = true
}

void Form_VisibleChanged(object sender, EventArgs e)
{
  VisibleChanged -= Form_VisibleChanged;

  splashScreen.Dispose(); // oder Hide
}

Jedoch erscheint mir dies ziemlich umständlich zu sein, insbesondere daß du der Form dann die SplashScreen-Instanz (splashScreen) bekannt machen mußt.

Schau auch mal hier rein:
Tutorial für Splash Screen gesucht?
Splashscreen aber wie?

Empfehlen kann ich auch diese beiden Komponenten:
SplashScreen-Komponente (noch eine ;-P) (mein Favorit, jedoch solltest du hier auch new MainForm() innerhalb der SplashScreen-Aktion durchführen, damit die Form-Initialisierung auch noch berücksichtigt wird)
Yet another SplashScreenHelper
Talemantros Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 444
Erhaltene Danke: 2

Win7 Proff 64bit
C# (VS2013)
BeitragVerfasst: So 09.03.14 18:08 
Hi Th69,
ich werden mir die Beispiele mal anschauen, habe aber Bedenken, dass ich sie nicht richtig nachvollziehen kann.
Ich bin gespannt

Ich hatte es jetzt mal so probiert, allerdings startet das Programm ohne was anzuzeigen und nach Ablauf der Schleife kommt ein Fehler ohne weitere Angaben und fragt mich ob ich Informationen an Windows senden will.

ausblenden volle Höhe C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
    public partial class Hauptform : Form
    {
        Splash spScreen;

        public Hauptform()
        {
            InitializeComponent();

            bwSplash.WorkerReportsProgress = true;
            bwSplash.WorkerSupportsCancellation = true;

            spScreen = new Splash();
        }
        
        private void Hauptform_Load(object sender, EventArgs e)
        {
            if (bwSplash.IsBusy != true)
            {
                spScreen.Show();
                
                this.WindowState = FormWindowState.Minimized;
                this.ShowInTaskbar = false;

                bwSplash.RunWorkerAsync();
            }
        }

        private void bwSplash_DoWork(object sender, DoWorkEventArgs e)
        {
            BackgroundWorker worker = sender as BackgroundWorker;

            for (int i = 0; i <= 100; i++)
            {
                if (worker.CancellationPending == true)
                {
                    e.Cancel = true;
                    break;
                }
                else
                {
                    System.Threading.Thread.Sleep(500);
                }
            }
        }

        private void bwSplash_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            spScreen.Close();

            this.WindowState = FormWindowState.Normal;
            this.ShowInTaskbar = true;
        }
    }


ICh probiere mal weiter

VG
Daniel