Perché è la mia Forma così timido?
-
22-08-2019 - |
Domanda
EDIT 2
Bene, sulla base del parere sulle risposte di seguito ho eliminato il mio thread approccio e ora il mio programma come questo:programma.cs
static void Main(){
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
FrmWWCShell FrmWWCShell = null;
var splash = new FrmSplash();
splash.SplashFormInitialized += delegate
{
FrmWWCShell = new FrmWWCShell();
splash.Close();
};
Application.Run(splash);
Application.Run(FrmWWCShell);
}
E FrmSplash.cs come questa:
public partial class FrmSplash : Form
{
public FrmSplash()
{
InitializeComponent();
}
protected override void OnLoad(EventArgs e)
{
splashTimer.Interval = 1;
splashTimer.Tick +=
delegate { if (SplashFormInitialized != null) SplashFormInitialized(this, EventArgs.Empty); };
splashTimer.Enabled = true;
}
public event EventHandler SplashFormInitialized;
}
Il problema è che non funziona a tutti ora.La schermata iniziale si apre per una frazione di secondo, il marque barra di avanzamento mai inizializza e poi scompare, mentre io aspetto il 10 sec per la dll e Principale Forma di spettacolo, mentre fissava il nulla....
Color me gravemente confuso ora!
POST ORIGINALE--> per riferimento
Ho realizzato un App Caricamento della schermata iniziale, che opera su un thread separato, mentre tutte le dll sono carico e la forma è sempre "Dipinto". Che funziona come previsto.La cosa strana è che ora quando lo Splash forma uscite invia il mio Form principale per il posteriore, se c'è qualcos'altro che aprire(cioèOutlook).Io inizio il thread in Programma.cs,
static class Program
{
public static Thread splashThread;
[STAThread]
static void Main()
{
splashThread = new Thread(doSplash);
splashThread.Start();
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new FrmWWCShell());
}
private static void doSplash()
{
var splashForm = new FrmSplash();
splashForm.ShowDialog();
}
}
E poi io alla fine una volta il mio FrmSearch_Shown viene generato un evento.
private void FrmSearch_Shown(object sender, EventArgs e)
{
Program.splashThread.Abort();
this.Show();
this.BringToFront();
}
Io, come potete vedere, hanno provato a chiamare un Show() e/o BringToFront() su FrmSearch e ancora "salti"per il posteriore.
Che cosa mi manca?
Cos'altro posso provare?
Sto facendo così terribilmente ignorante che è il mio processo che è la causa di questo?
Dovrei file per il pensionamento anticipato?
Grazie per la comprensione!
EDIT 1
Ho provato l'impostazione del Primo di Proprietà sul mio Principale Forma di VERO.Questo mantiene il mio modulo da nascondere, ma mantiene anche l'utente di guardare a tutte le altre app.Sembra un po ' narcisistico di me...
Soluzione
Prima di tutto, è molto importante che la UI di lavoro è di fatto il campo di applicazione principale del thread.In realtà io sono un po ' sorpreso che non stai ricevendo più gravi errori già mostrando la schermata iniziale in un thread in background.
Ecco una tecnica che ho usato:
Usare L'Applicazione.Eseguire sul vostro splash forma piuttosto che il tuo "vero" forma.
Nel splash forma, hanno un inizializzato evento:
public event EventHandler SplashFormInitialized
Creare un timer che attiva in un millisecondo, e trigger per l'evento.
Quindi nell'applicazione del metodo run è possibile caricare la vostra vera forma, quindi chiudere il tonfo di forma e non di un'Applicazione.Eseguire la forma reale
var realForm = null;
var splash = new SplashForm();
splash.SplashFormInitialized += delegate {
// As long as you use a system.windows.forms.Timer in the splash form, this
// handler will be called on the UI thread
realForm = new FrmWWCShell();
//do any other init
splash.Close();
}
Application.Run(splash); //will block until the splash form is closed
Application.Run(realForm);
Splash possono includere:
overrides OnLoad(...)
{
/* Using a timer will let the splash screen load and display itself before
calling this handler
*/
timer.Interval = 1;
timer.Tick += delegate {
if (SplashFormInitialized != null) SplashFormInitialized(this, EventArgs.Empty);
};
timer.Enabled = true;
}
Altri suggerimenti
Provare a chiamare Applicazione.DoEvents() subito dopo sfilata.
Avviso:non chiamare la funzione DoEvents molto spesso, ma questo è uno di quei tempo.
EDIT:Clyde notato una cosa che non ho:si filettatura questo.Non eseguire qualsiasi interfaccia utente in un altro thread.Prendere il filo, lasciare l'Applicazione.DoEvents().