Buscar..


Introducción

Cuando se inicia la aplicación WPF, el tiempo de ejecución de un idioma actual (CLR) puede tardar un tiempo en inicializar .NET Framework. Como resultado, la primera ventana de la aplicación puede aparecer algún tiempo después del inicio de la aplicación, dependiendo de la complejidad de la aplicación. La pantalla de bienvenida en WPF permite que la aplicación muestre imágenes estáticas o contenido dinámico personalizado durante la inicialización antes de que aparezca la primera ventana.

Añadiendo pantalla de bienvenida simple

Siga estos pasos para agregar la pantalla de bienvenida a la aplicación WPF en Visual Studio:

  1. Cree u obtenga cualquier imagen y agréguela a su proyecto (por ejemplo, dentro de la carpeta Imágenes ):

introduzca la descripción de la imagen aquí

  1. Abra la ventana de propiedades para esta imagen ( Ver → Ventana de propiedades ) y cambie la configuración de la acción de compilación al valor de SplashScreen :

introduzca la descripción de la imagen aquí

  1. Ejecutar la aplicación. Verá la imagen de la pantalla de inicio en el centro de la pantalla antes de que aparezca la ventana de la aplicación (después de que aparezca la ventana, la imagen de la pantalla de inicio se desvanecerá en unos 300 milisegundos).

Prueba de pantalla de bienvenida

Si su aplicación es liviana y simple, se iniciará muy rápido y con una velocidad similar aparecerá y desaparecerá la pantalla de bienvenida.

Tan pronto como la pantalla de inicio desaparezca después de que se complete el método Application.Startup , puede simular el retraso de inicio de la aplicación siguiendo estos pasos:

  1. Abrir el archivo App.xaml.cs
  2. Agregar usando el espacio de nombres using System.Threading;
  3. OnStartup método OnStartup y agregue Thread.Sleep(3000); dentro de eso:

introduzca la descripción de la imagen aquí

El código debería verse como:

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. Ejecutar la aplicación. Ahora se iniciará durante unos 3 segundos más, por lo que tendrá más tiempo para probar su pantalla de inicio.

Creando ventana de pantalla de bienvenida personalizada

WPF no admite la visualización de nada más que una imagen como una pantalla de inicio, así que tendremos que crear una Window que servirá como pantalla de inicio. Suponemos que ya hemos creado un proyecto que contiene la clase MainWindow , que será la ventana principal de la aplicación.

En primer lugar, agregamos una ventana SplashScreenWindow a nuestro proyecto:

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

Luego, anulamos el método Application.OnStartup para mostrar la pantalla de inicio , realizar algún trabajo y finalmente mostrar la ventana principal ( 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();
            });
        });
    }
}

Por último, debemos cuidar el mecanismo predeterminado que muestra MainWindow en el inicio de la aplicación. Todo lo que necesitamos hacer es eliminar el StartupUri="MainWindow.xaml" de la etiqueta de la Application raíz en el archivo App.xaml .

Creación de la ventana de la pantalla de bienvenida con informes de progreso

WPF no admite la visualización de nada más que una imagen como una pantalla de inicio, así que tendremos que crear una Window que servirá como pantalla de inicio. Suponemos que ya hemos creado un proyecto que contiene la clase MainWindow , que será la ventana principal de la aplicación.

En primer lugar, agregamos una ventana SplashScreenWindow a nuestro proyecto:

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

Luego exponemos una propiedad en la clase SplashScreenWindow para que podamos actualizar fácilmente el valor de progreso actual ( SplashScreenWindow.xaml.cs ):

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

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

A continuación, anulamos el método Application.OnStartup para mostrar la pantalla de inicio , realizar algún trabajo y finalmente mostrar la ventana principal ( 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();
            });
        });
    }
}

Por último, debemos cuidar el mecanismo predeterminado que muestra MainWindow en el inicio de la aplicación. Todo lo que necesitamos hacer es eliminar el StartupUri="MainWindow.xaml" de la etiqueta de la Application raíz en el archivo App.xaml .



Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow