Szukaj…


Wprowadzenie

Po uruchomieniu aplikacji WPF zainicjowanie programu .NET Framework może zająć trochę czasu dla bieżącego środowiska uruchomieniowego języka (CLR). W rezultacie pierwsze okno aplikacji może pojawić się jakiś czas po uruchomieniu aplikacji, w zależności od złożoności aplikacji. Ekran powitalny w WPF pozwala aplikacji wyświetlać obraz statyczny lub niestandardową zawartość dynamiczną podczas inicjalizacji przed pojawieniem się pierwszego okna.

Dodanie prostego ekranu powitalnego

Wykonaj następujące kroki, aby dodać ekran powitalny do aplikacji WPF w Visual Studio:

  1. Utwórz lub pobierz dowolny obraz i dodaj go do swojego projektu (np. W folderze Obrazy ):

wprowadź opis zdjęcia tutaj

  1. Otwórz okno właściwości tego obrazu ( Widok → Okno właściwości ) i zmień ustawienie Kompilacji działania na wartość SplashScreen :

wprowadź opis zdjęcia tutaj

  1. Uruchom aplikację. Zobaczysz obraz ekranu powitalnego na środku ekranu, zanim pojawi się okno aplikacji (po wyświetleniu okna obraz ekranu powitalnego zniknie w ciągu około 300 milisekund).

Testowanie ekranu powitalnego

Jeśli aplikacja jest lekka i prosta, uruchomi się bardzo szybko, z podobną prędkością pojawi się i zniknie ekran powitalny.

Gdy tylko ekran powitalny zniknie po zakończeniu metody Application.Startup , możesz zasymulować opóźnienie uruchomienia aplikacji, wykonując następujące kroki:

  1. Otwórz plik App.xaml.cs
  2. Dodaj za pomocą przestrzeni nazw using System.Threading;
  3. Zastąp metodę OnStartup i dodaj Thread.Sleep(3000); w środku tego:

wprowadź opis zdjęcia tutaj

Kod powinien wyglądać następująco:

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. Uruchom aplikację. Teraz będzie działać przez około 3 sekundy dłużej, więc będziesz mieć więcej czasu na przetestowanie ekranu powitalnego.

Tworzenie niestandardowego okna ekranu powitalnego

WPF nie obsługuje wyświetlania niczego poza obrazem jako ekranu powitalnego od razu po wyjęciu z pudełka, więc będziemy musieli stworzyć Window które będzie służyć jako ekran powitalny. Zakładamy, że stworzyliśmy już projekt zawierający klasę MainWindow , która ma być głównym oknem aplikacji.

Po pierwsze dodajemy okno SplashScreenWindow do naszego projektu:

<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>

Następnie zastępujemy metodę Application.OnStartup , aby wyświetlić ekran powitalny, trochę popracować i wreszcie wyświetlić okno główne ( 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();
            });
        });
    }
}

Na koniec musimy zadbać o domyślny mechanizm, który pokazuje MainWindow podczas uruchamiania aplikacji. Wszystko, co musimy zrobić, to usunąć StartupUri="MainWindow.xaml" z głównego znacznika Application w pliku App.xaml .

Tworzenie okna powitalnego z raportowaniem postępu

WPF nie obsługuje wyświetlania niczego poza obrazem jako ekranu powitalnego od razu po wyjęciu z pudełka, więc będziemy musieli stworzyć Window które będzie służyć jako ekran powitalny. Zakładamy, że stworzyliśmy już projekt zawierający klasę MainWindow , która ma być głównym oknem aplikacji.

Po pierwsze dodajemy okno SplashScreenWindow do naszego projektu:

<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>

Następnie udostępniamy właściwość klasy SplashScreenWindow , abyśmy mogli łatwo zaktualizować bieżącą wartość postępu ( SplashScreenWindow.xaml.cs ):

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

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

Następnie zastąpimy metodę Application.OnStartup , aby wyświetlić ekran powitalny, trochę popracować i wreszcie wyświetlić okno główne ( 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();
            });
        });
    }
}

Na koniec musimy zadbać o domyślny mechanizm, który pokazuje MainWindow podczas uruchamiania aplikacji. Wszystko, co musimy zrobić, to usunąć StartupUri="MainWindow.xaml" z głównego znacznika Application w pliku App.xaml .



Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow