Domanda

Ho ancora un problema con la schermata iniziale. Non voglio utilizzare il SC.TopMost=true proprietà.

Ora il mio scenario di applicazione è il seguente:

in progeram.cs:

[STAThread]
static void Main()
{
    new SplashScreen(_tempAL);// where _tempAL is an arrayList
    Application.Run(new Form1(_tempAL));
}

in classe SplashScreen:

public SplashScreen(ArrayList _Data)
{
    DisplaySplash()
} 
private void DisplaySplash()
{
    this.Show();
    this.TopMost = true;
    this.CenterToScreen();
    this.SetTopLevel(true);

    _allServerNarrators = new string[10];
    for (int i = 0; i < _allServerNarrators.Length; i++)
        _allServerNarrators[i] = null;

    GetFromServer();

    this.Hide();
    _serverData = new ArrayList();
    _thisData.Add(_allServerNarrators);
    _thisData.Add(_serverNarrators);

}
private void GetFromServer()
{
    _serverNarrators = new ArrayList();
    string _file = "Suras.serverNar";

    if (!Directory.Exists("c:\\ASGAQuraan"))
        Directory.CreateDirectory("c:\\ASGAQuraan");

    while (counter < 4 && _serverFiles == null)
    {
        if (Download("c:\\ASGAQuraan", _ftpServerIP, _file))
        {
            StreamReader _strReader = new StreamReader
                         ("c:\\ASGAQuraan\\"+_file,System.Text.Encoding.Default);
            string _line = _strReader.ReadLine();
            string _word;

            while (true)
            {
                while (_line != null)
                {
                    _word = _line.Substring(0, _line.IndexOf("*"));
                    int _narId = Convert.ToInt32(_word);
                    _line = _line.Substring(2);
                    int k = 0;
                    _serverNarratorNode = new ArrayList();
                    while (true)
                    {
                        int ind = _line.IndexOf("*");
                        if (ind > 0 && ind < _line.Length)
                        {
                            string str = _line.Substring(0, (ind));
                            if (k == 0)
                            {
                                _allServerNarrators[_narId] = str;
                                _serverNarratorNode.Add(str);
                            }
                            else
                            {
                                _serverNarratorNode.Add(str);
                            }
                            _line = _line.Substring(ind + 1);
                            k++;
                        }
                        else
                        {
                            _line = null;
                            break;
                        }
                    }
                    _serverNarrators.Add(_serverNarratorNode);
                    _serverFiles = "added";
                }
                _line = _strReader.ReadLine();
                if (_line == null)
                {
                    break;
                }
            }
        }
        else
            counter++;
    }
}

Quello che voglio è qualcosa nella classe schermata iniziale che attende fino al termine della discussione.

Per ulteriori informazioni, si prega di dirmi che cosa ho bisogno di dirvi.

È stato utile?

Soluzione

A seguito su 2 filetti è un po 'di confusione, ma ho intenzione di prendere una pugnalata e dire questo ...

Non capisco pienamente il vostro disegno qui, ma se il problema è che quando si lancia una seconda applicazione del modulo di splash screen diventa bianco ... E 'probabilmente dovuto al fatto che la Splash Screen è occupato l'esecuzione di tutto questo codice GetFromServer (). Così occupato che non ha il tempo di ri-pittura stessa.

Per rimediare a questo problema vorrei suggerire di utilizzare il componente BackgroundWorker per eseguire il metodo GetFromServer. Questo farà eseguire questo metodo in un thread separato e lasciare filo della forma libera di ri-pittura stessa.

Altri suggerimenti

Stessa domanda, stessa risposta:

Il framework .NET è eccellente supporto incorporato per la splash screen. Avviare un nuovo progetto WF, Project + Aggiungi riferimento, selezionare Microsoft.VisualBasic. Aggiungere un nuovo form, lo chiamano frmSplash. Aperte Project.cs e farlo sembrare come questo:

using System;
using System.Windows.Forms;
using Microsoft.VisualBasic.ApplicationServices;

namespace WindowsFormsApplication1 {
  static class Program {
    [STAThread]
    static void Main(string[] args) {
      Application.EnableVisualStyles();
      Application.SetCompatibleTextRenderingDefault(false);
      new MyApp().Run(args);
    }
  }
  class MyApp : WindowsFormsApplicationBase {
    protected override void OnCreateSplashScreen() {
      this.SplashScreen = new frmSplash();
    }
    protected override void OnCreateMainForm() {
      // Do your time consuming stuff here...
      //...
      System.Threading.Thread.Sleep(3000);
      // Then create the main form, the splash screen will close automatically
      this.MainForm = new Form1();
    }
  }
}

Hai inserito un territorio pericoloso con la creazione di UI prima della chiamata a Application.Run (). Application.Run è essenzialmente pompa messaggio del tuo programma. Visualizzando l'interfaccia utente prima di avviare la pompa di messaggi dell'applicazione, si effettua l'interazione tipica interfaccia utente effettivamente impossibile sulla UI prematura. Per una schermata iniziale questo può non sembrare rilevante, ma importa se (ad esempio) c'è una richiesta da fare scomparire la schermata iniziale se è cliccato, o si desidera utilizzare un BackgroundWorker.

Questi possono essere lavorati in giro con la creazione di una pompa messaggio nella schermata di avvio (rendendolo modale tramite una chiamata a ShowDialog () al posto di Show ()), ma questo è trattare il sintomo quando trattare il problema in realtà non è che difficile.

Mi piacerebbe Incoraggio vivamente di nobugz risposta in questo caso. Il framework fornisce il supporto necessario. Mentre le caratteristiche nello spazio dei nomi Microsoft.VisualBasic non sono sempre molto raggiungibile per programmatori C #, possono essere un vero e proprio risparmio di tempo e salvavita per casi come questo.

In bocca al lupo!

Si dovrebbe dare maggiori dettagli sul tuo problema. Potrei essere completamente sbagliato, ma ho intenzione di prendere un salto nel buio. Da quello che sto immaginando sta succedendo e che si desidera, si desidera che la schermata iniziale per mostrare, fare un po 'di elaborazione in un altro thread, quindi la schermata iniziale di andare via quando hai finito.

Per fare questo, si sta andando a voler spostare la chiamata GetFromServer() ad un BackgroundWorker. Quindi spostare il

    this.Hide();
    _serverData = new ArrayList();
    _thisData.Add(_allServerNarrators);
    _thisData.Add(_serverNarrators);

codice al gestore di eventi BackgroundWorker_RunWorkerCompleted.

Per usare il BackgroundWorker :

1) Inizializzare la BackGroundWorker

  BackgroundWorker myWorker = new BackgroundWorker();

2) Aggiungere i gestori di eventi

  myWorker.DoWork += new DoWorkEventHandler(myWorker_DoWork);
  //put the work you want done in this one

  myWorker.RunWorkerCompleted += 
      new RunWorkerCompletedEventHandler(myWorker_RunWorkerCompleted);
  //this gets fired when the work is finished

3) Aggiungere il codice per i gestori di eventi.

4) Chiamata myWorker.RunWorkerAsync() per iniziare a lavorare.

Come nota a parte, non sembra di fare qualsiasi cosa con il ArrayList che si sta passando al costruttore della schermata iniziale. È questo destinato?

Purtroppo non ho abbastanza fama di commentare qualcuno risponde ancora. :( Questo vuole essere la risposta a colonnello Panico commentare Hans passants rispondere .

Il suo problema era che un MessageBox mostrata da new FormMain(args)will essere mostrato dietro la schermata iniziale. La chiave è quella di richiamare il MessageBox dal filetto la schermata di avvio viene eseguito in:

splashScreen.Invoke(new Action(() => {
    MessageBox.Show(splashScreen, "the message");
}));

Dove splashScreen è un riferimento all'oggetto schermata iniziale che è stato creato in OnCreateSplashScreen e ovviamente deve essere data al nuovo oggetto Form1.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top