Hide WPF finestra fino a Fully Loaded
-
18-09-2019 - |
Domanda
Per la mia applicazione WPF, sto archiviazione di vari impostazioni dell'utente come posizione della finestra, stato della finestra, e se non per visualizzare una finestra di benvenuto. Il problema è che mentre tutto sta caricando su, vedo un sacco di lampeggiare e lampeggiare come le finestre vengono caricati in, e poi più sfarfallio quando la finestra è massimizzata dopo aver letto nelle impostazioni.
Sono già utilizzando il built-in funzionalità splash screen WPF PNG, ma c'è un modo per nascondere completamente il rendering di tutte le finestre fino a quando tutto è a pieno carico in?
Soluzione
Modificare l'Application.xaml, rimuovere lo StartupUri, invece impostare il gestore di eventi di avvio. In Application.xaml.cs, modificare il gestore di eventi di avvio per visualizzare lo splashscreen, caricare le tue risorse, creare tutto, quindi creare la finestra principale e mostrarlo.
<Application
...
StartUp="OnStartUp"
/>
E
private void OnStartUp(Object sender, StartupEventArgs e)
{
var settings = LoadSettingsFrom... // Call your implementation of load user settings
// Example only, in real app do this if's section on a different thread
if (settings.doShowSplashScreen)
{
var splashScreen = new SplashScreen();
splashScreen.Show();
}
// Load and create stuff (resources, databases, main classes, ...)
var mainWindow = new mainWindow();
mainWindow.ApplySettings(settings); // Call your implementation of apply settings
if (doShowSplashScreen)
{
// send close signal to splash screen's thread
}
mainWindow.Show(); // Show the main window
}
Altri suggerimenti
Ci sono funzioni, BeginInit e EndInit, se si modificano le proprietà all'interno di queste funzioni come ..
BeginInit();
...
... // Do your code Initialization here...
...
EndInit();
allora la vostra finestra non renderà finché non viene chiamato l'EndInit (), non lampeggia.
È possibile impostare le finestre WindowState per Minimized, poi gestire l'evento ContentRendered e impostare il WindowState Normale o massimizzata.
Quando si verifica questo carico? Codice eseguito nel costruttore del Window
principale dovrebbe eseguire prima della visualizzazione della finestra; se si carica tutte le risorse necessarie lì, non si dovrebbe vedere alcun sfarfallio.