Table of Contents
C# Create a WPF Splash Screen
In this post we will create a simple Splash Screen for a WPF application.
Assets
Within the Visual Studio project create a folder called Assets with a sub folder called Images/ Once this is done add a .png file called BackGround.png, ensure you set the properties Build Action to Resources and Copy to Output Directory to Copy if Newer.
Materials Design
First we want to add a Nuget Package called Materials Design, this can be easily done by editing the Project.cs file and adding the following Package Reference.
<ItemGroup>
<PackageReference Include="MaterialDesignThemes" Version="4.9.0" />
</ItemGroup>
Once this is done we can update the App.xaml file by adding the following Application Resources.
<Application.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="pack://application:,,,/MaterialDesignThemes.Wpf;component/Themes/MaterialDesignTheme.Light.xaml" />
<ResourceDictionary Source="pack://application:,,,/MaterialDesignThemes.Wpf;component/Themes/MaterialDesignTheme.Defaults.xaml" />
<ResourceDictionary Source="pack://application:,,,/MaterialDesignColors;component/Themes/Recommended/Primary/MaterialDesignColor.DeepPurple.xaml" />
<ResourceDictionary Source="pack://application:,,,/MaterialDesignColors;component/Themes/Recommended/Accent/MaterialDesignColor.Lime.xaml" />
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Application.Resources>
Splash Screen Window
Next we will add a new XAML Window called SplashScreen to the project.
SplashScreen.xaml
Next we will edit the SplashScreen.xaml file, to layout the splash screen.
<Window x:Class="WPFSplashScreen.SplashScreen"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:WPFSplashScreen"
xmlns:materialDesign="http://materialdesigninxaml.net/winfx/xaml/themes"
mc:Ignorable="d"
Title="SplashScreen" Height="470" Width="750"
WindowStyle="None"
WindowStartupLocation="CenterScreen"
AllowsTransparency="True"
Background="{x:Null}" ContentRendered="Window_ContentRendered">
<materialDesign:Card
UniformCornerRadius="15"
Background="{DynamicResource MaterialDesignPaper}"
materialDesign:ElevationAssist.Elevation="Dp4"
Margin="25">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="350"/>
<ColumnDefinition Width="400"/>
</Grid.ColumnDefinitions>
<StackPanel
Grid.Column="0"
HorizontalAlignment="Left"
VerticalAlignment="Center"
Margin="50,0,0,0">
<WrapPanel>
<Image
Source="Assets/Images/BackGround.png"
HorizontalAlignment="Left"
Height="50"
Width="50"></Image>
<TextBlock
Text="TrueNorth PLM"
FontSize="28"
FontWeight="Bold"
HorizontalAlignment="Left"
VerticalAlignment="Center"
Margin="15,0,0,0">
</TextBlock>
</WrapPanel>
<TextBlock
Text="Loading Reources"
FontSize="17"
FontWeight="SemiBold"
HorizontalAlignment="Left"
Margin="0,30,0,15"/>
<ProgressBar
Name="progressBar"
Value="0"
Height="5"
Width="280"
IsIndeterminate="True"/>
</StackPanel>
<StackPanel
Grid.Column="1"
HorizontalAlignment="Left"
VerticalAlignment="Center"
Height="320"
Width="320">
<Image
Source="Assets/Images/BackGround.png"
Width="320"
Height="320"/>
</StackPanel>
</Grid>
</materialDesign:Card>
</Window>
SplashScreen.xaml.cs
The code below manages the length of time the splash screen is displayed, after which it will close the splash screen and then display the main window.
using System;
using System.ComponentModel;
using System.Threading;
using System.Windows;
namespace WPFSplashScreen
{
public partial class SplashScreen : Window
{
public SplashScreen()
{
InitializeComponent();
}
private void Window_ContentRendered(object sender, EventArgs e)
{
BackgroundWorker worker = new BackgroundWorker();
worker.WorkerReportsProgress = true;
worker.DoWork += worker_DoWork;
worker.ProgressChanged += worker_ProgressChanged;
worker.RunWorkerAsync();
}
private void worker_DoWork(object? sender, DoWorkEventArgs e)
{
for (int i = 0; i <= 100; i++)
{
if (sender is BackgroundWorker)
{
BackgroundWorker worker = (BackgroundWorker)sender;
worker.ReportProgress(i);
Thread.Sleep(80);
}
}
}
private void worker_ProgressChanged(object? sender, ProgressChangedEventArgs e)
{
progressBar.Value = e.ProgressPercentage;
if(progressBar.Value ==100)
{
MainWindow mainWindow = new MainWindow();
Close();
mainWindow.ShowDialog();
}
}
}
}
StartUp URI
Finally we can change the StartUpUri to point to the new Splash Screen window.
<Application x:Class="WPFSplashScreen.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:WPFSplashScreen"
StartupUri="SplashScreen.xaml">
Executing the Code
When the code executes we should first see the following Splash Screen then the Main Window shortly afterwards.
