Ricerca…


introduzione

Quando l'applicazione WPF è stata avviata, potrebbe essere necessario un po 'di tempo prima che il linguaggio corrente runtime (CLR) inizializzi .NET Framework. Di conseguenza, la prima finestra dell'applicazione può apparire dopo l'avvio dell'applicazione, a seconda della complessità dell'applicazione. La schermata iniziale in WPF consente all'applicazione di mostrare l'immagine statica o il contenuto dinamico personalizzato durante l'inizializzazione prima che venga visualizzata la prima finestra.

Aggiunta di una semplice schermata iniziale

Segui questa procedura per aggiungere lo splash screen all'applicazione WPF in Visual Studio:

  1. Crea o ottieni un'immagine e aggiungila al tuo progetto (ad esempio all'interno della cartella Immagini ):

inserisci la descrizione dell'immagine qui

  1. Aprire la finestra delle proprietà per questa immagine ( Visualizza → Finestra Proprietà ) e modificare l'impostazione Azione di costruzione sul valore SplashScreen :

inserisci la descrizione dell'immagine qui

  1. Esegui l'applicazione. Verrà visualizzata l'immagine della schermata iniziale al centro dello schermo prima che venga visualizzata la finestra dell'applicazione (dopo che è stata visualizzata la finestra, l'immagine dello splash screen si dissolverà entro circa 300 millisecondi).

Test di Splash Screen

Se la tua applicazione è leggera e semplice, si avvierà molto velocemente e con la stessa velocità apparirà e scomparirà lo splash screen.

Non appena la schermata iniziale scompare dopo il completamento del metodo Application.Startup , è possibile simulare il ritardo dell'avvio dell'applicazione seguendo questa procedura:

  1. Apri il file App.xaml.cs
  2. Aggiungi usando lo spazio dei nomi using System.Threading;
  3. Sostituire il metodo OnStartup e aggiungere Thread.Sleep(3000); dentro:

inserisci la descrizione dell'immagine qui

Il codice dovrebbe essere simile a:

using System;
using System.Collections.Generic;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Threading;
using System.Windows;

namespace WpfApplication1
{
    /// <summary>
    /// Interaction logic for App.xaml
    /// </summary>
    public partial class App : Application
    {
        protected override void OnStartup(StartupEventArgs e)
        {
            base.OnStartup(e);

            Thread.Sleep(3000);
        }
    }
}
  1. Esegui l'applicazione. Ora verrà avviato per circa 3 secondi in più, quindi avrai più tempo per testare la schermata iniziale.

Creazione di una finestra di splash screen personalizzata

WPF non supporta la visualizzazione di qualcosa di diverso da un'immagine come una schermata iniziale, quindi sarà necessario creare una Window che fungerà da schermata iniziale. Supponiamo di aver già creato un progetto contenente la classe MainWindow , che deve essere la finestra principale dell'applicazione.

Prima di tutto aggiungiamo una finestra SplashScreenWindow al nostro progetto:

<Window x:Class="SplashScreenExample.SplashScreenWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        WindowStartupLocation="CenterScreen"
        WindowStyle="None"
        AllowsTransparency="True"
        Height="30"
        Width="200">
    <Grid>
        <ProgressBar IsIndeterminate="True" />
        <TextBlock HorizontalAlignment="Center"
                   VerticalAlignment="Center">Loading...</TextBlock>
    </Grid>
</Window>

Quindi eseguiamo l'override del metodo Application.OnStartup per mostrare la schermata iniziale, fare un po 'di lavoro e infine mostrare la finestra principale ( App.xaml.cs ):

public partial class App
{
    protected override void OnStartup(StartupEventArgs e)
    {
        base.OnStartup(e);

        //initialize the splash screen and set it as the application main window
        var splashScreen = new SplashScreenWindow();
        this.MainWindow = splashScreen;
        splashScreen.Show();

        //in order to ensure the UI stays responsive, we need to
        //do the work on a different thread
        Task.Factory.StartNew(() =>
        {
            //simulate some work being done
            System.Threading.Thread.Sleep(3000);

            //since we're not on the UI thread
            //once we're done we need to use the Dispatcher
            //to create and show the main window
            this.Dispatcher.Invoke(() =>
            {
                //initialize the main window, set it as the application main window
                //and close the splash screen
                var mainWindow = new MainWindow();
                this.MainWindow = mainWindow;
                mainWindow.Show();
                splashScreen.Close();
            });
        });
    }
}

Infine, dobbiamo occuparci del meccanismo predefinito che mostra MainWindow all'avvio dell'applicazione. Tutto quello che dobbiamo fare è rimuovere l' StartupUri="MainWindow.xaml" dal tag Application root nel file App.xaml .

Creazione di una schermata iniziale con report di avanzamento

WPF non supporta la visualizzazione di qualcosa di diverso da un'immagine come una schermata iniziale, quindi sarà necessario creare una Window che fungerà da schermata iniziale. Supponiamo di aver già creato un progetto contenente la classe MainWindow , che deve essere la finestra principale dell'applicazione.

Prima di tutto aggiungiamo una finestra SplashScreenWindow al nostro progetto:

<Window x:Class="SplashScreenExample.SplashScreenWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        WindowStartupLocation="CenterScreen"
        WindowStyle="None"
        AllowsTransparency="True"
        Height="30"
        Width="200">
    <Grid>
        <ProgressBar x:Name="progressBar" />
        <TextBlock HorizontalAlignment="Center"
                   VerticalAlignment="Center">Loading...</TextBlock>
    </Grid>
</Window>

Quindi esponiamo una proprietà nella classe SplashScreenWindow modo da poter aggiornare facilmente il valore di avanzamento corrente ( SplashScreenWindow.xaml.cs ):

public partial class SplashScreenWindow : Window
{
    public SplashScreenWindow()
    {
        InitializeComponent();
    }

    public double Progress
    {
        get { return progressBar.Value; }
        set { progressBar.Value = value; }
    }
}

Quindi sostituiremo il metodo Application.OnStartup per mostrare la schermata iniziale, fare un po 'di lavoro e infine mostrare la finestra principale ( App.xaml.cs ):

public partial class App : Application
{
    protected override void OnStartup(StartupEventArgs e)
    {
        base.OnStartup(e);

        //initialize the splash screen and set it as the application main window
        var splashScreen = new SplashScreenWindow();
        this.MainWindow = splashScreen;
        splashScreen.Show();

        //in order to ensure the UI stays responsive, we need to
        //do the work on a different thread
        Task.Factory.StartNew(() =>
        {
            //we need to do the work in batches so that we can report progress
            for (int i = 1; i <= 100; i++)
            {
                //simulate a part of work being done
                System.Threading.Thread.Sleep(30);

                //because we're not on the UI thread, we need to use the Dispatcher
                //associated with the splash screen to update the progress bar
                splashScreen.Dispatcher.Invoke(() => splashScreen.Progress = i);
            }

            //once we're done we need to use the Dispatcher
            //to create and show the main window
            this.Dispatcher.Invoke(() =>
            {
                //initialize the main window, set it as the application main window
                //and close the splash screen
                var mainWindow = new MainWindow();
                this.MainWindow = mainWindow;
                mainWindow.Show();
                splashScreen.Close();
            });
        });
    }
}

Infine, dobbiamo occuparci del meccanismo predefinito che mostra MainWindow all'avvio dell'applicazione. Tutto quello che dobbiamo fare è rimuovere l' StartupUri="MainWindow.xaml" dal tag Application root nel file App.xaml .



Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow