WPF Wizard


WPF does not have a built-in wizard control. What you can do, however, is use a work-around. The WPF Extended Toolkit by Xceed does have a Wizard.

Here is a YouTube video that shows us how to create a simple Wizard in WPF after you create the wizard you can modify and extend it to suit your project requirements. The video is called How to Create a Simple Wizard with WPF and it is produced by Learn 2 Stop Hunger.

What is the end-result of this wizard-creating process? There is a series of screenshots at the end of this post.

Steps

What are the steps to creating a wizard?

  1. Create your application as normal. Name it WizardWPFExtendedToolkit (if you want to follow along with the code listings below) or whatever you like.
  2. Go to Nuget Package Manager and install the Extended WPF Toolkit by Xceed (it has over 4 million downloads and an orange and white icon).
  3. To the project, Add a WPF Window and name it WizardWindow.xaml
  4. Go to the MainWindow.xaml and add a “Launch Wizard” Button inside the Grid. Give it a name and size it.
  5. Create an event handler for the Click event for that Button
  6. In the Click event in C#, declare a new instance of the Wizard window and show it.
  7. Add a namespace for the Extended WPF Toolkit to the WizardWindow
  8. Copy in the example code into the Grid in the WizardWindow
  9. Have a close look at the code and prepare to modify it by creating separate ending tags for each of the pages
  10. Add your own content. For example, ask the user for their name.
  11. By default, you can’t go to the next page until you enter something in the name box. Add the code.
  12. Add the event handler TextChanged code to set the Page1.CanSelectNextPage
  13. In the MainWindow get the text the user entered and show a message box to test that it is working.
  14. Test and debug.
  15. Add more content to the existing wizard pages and add more pages as necessary.
  16. Do something with the user’s responses to the wizard.

Below is the code. Here is the XAML for the MainWindow.xaml.

<Window x:Class="WizardWPFExtendedToolkit.MainWindow"
        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:WizardWPFExtendedToolkit"
        mc:Ignorable="d"
        WindowStartupLocation="CenterScreen"
        Title="WizardWPFExtendedToolkit - MainWindow.xaml" Height="350" Width="525">
    <Grid>
        <Button Name="BtnLaunchWizard" Height="50" Width="100" Click="BtnLaunchWizard_Click">Launch Wizard</Button>
    </Grid>
</Window>

Below is the code behind for the MainWindow.xaml.cs.

using System.Windows;

namespace WizardWPFExtendedToolkit
{ 
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }
        private void BtnLaunchWizard_Click(object sender, RoutedEventArgs e)
        {
            var win = new WizardWindow();
            win.ShowDialog();
            if (!string.IsNullOrEmpty(win.FirstNameTextBox.Text))
                MessageBox.Show("Hello " + win.FirstNameTextBox.Text + "!");
        }
    }
}

Below is the example XAML code for the WizardWindow.xaml. This is the code you may copy in.

<Window x:Class="WizardWPFExtendedToolkit.WizardWindow"
        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:xctk="http://schemas.xceed.com/wpf/xaml/toolkit"
        xmlns:local="clr-namespace:WizardWPFExtendedToolkit"
        mc:Ignorable="d"
        WindowStartupLocation="CenterScreen"
        Title="WizardWPFExtendedToolkit - WizardWindow.xaml" Height="350" Width="520">
    <Grid>
        <xctk:Wizard FinishButtonClosesWindow="True">
            <xctk:WizardPage x:Name="IntroPage" 
                                   Title="Welcome to my Wizard"
                                   Description="This Wizard will walk you though how to do something." />
            <xctk:WizardPage x:Name="Page1" PageType="Interior"
                                   Title="Page 1"
                                   Description="This is the first page in the process."
                                   NextPage="{Binding ElementName=Page2}"
                                   PreviousPage="{Binding ElementName=IntroPage}"
                             CanSelectNextPage="False">
                <Grid>
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="*"/>
                        <ColumnDefinition Width="5px"/>
                        <ColumnDefinition Width="2*"/>
                    </Grid.ColumnDefinitions>
                    <Grid.RowDefinitions>
                        <RowDefinition Height="Auto"/>
                        <RowDefinition Height="*"/>
                    </Grid.RowDefinitions>
                    <TextBlock Text="First Name:"/>
                    <TextBox Grid.Column="2" Name="FirstNameTextBox"  TextChanged="FirstNameTextBox_TextChanged"/>
                </Grid>
            </xctk:WizardPage>
            <xctk:WizardPage x:Name="Page2" PageType="Interior"
                                   Title="Page 2"
                                   Description="This is the second page in the process">
                <Grid>
                    <TextBox>This is some items...info, text boxes, radio buttons, pretty pictures...</TextBox>
                </Grid>
            </xctk:WizardPage>
            <xctk:WizardPage x:Name="LastPage" PageType="Interior"
                                   Title="Last Page"
                                   Description="This is the last page in the process"
                                   CanFinish="True"/>
        </xctk:Wizard>
    </Grid>
</Window>

Below is the code behind for the WizardWindow.xaml.cs. This gives us a code pattern to follow for each screen on the wizard so that the user cannot go forward with first providing some information or input such as checking a check box or clicking a radio button.

using System.Windows;
namespace WizardWPFExtendedToolkit
{
    public partial class WizardWindow : Window
    {
        public WizardWindow()
        {
            InitializeComponent();
        }
        private void FirstNameTextBox_TextChanged(object sender, System.Windows.Controls.TextChangedEventArgs e)
        {
            if (string.IsNullOrEmpty(FirstNameTextBox.Text))
            {
                Page1.CanSelectNextPage = false;
            }
            else
            {
                Page1.CanSelectNextPage = true;
            }
        }
    }
}

Below are the screenshots.