Как открыть дочернее окно, как заставку перед MainWindow в WPF?

У меня есть два xaml. Одним из них является MainWindow, а другим - NewWindow. Я хочу показать NewWindow 5 секунд, когда программа запущена. И через 5 секунд я хочу показать MainWindow.

Как изменить xaml в WPF?

Вот главное окно.

<Window x:Class="WpfApplication2.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MainWindow" Height="350" Width="525">
<Grid>

</Grid>

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

Вот новое окно.

<Window x:Class="WpfApplication2.NewWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="NewWindow" Height="300" Width="300">
<Grid>

</Grid>

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

4 ответа

Решение

Есть много способов сделать это. Как некоторые люди предложили, я тоже предлагаю НЕ ДЕЛАЙТЕ ЭТОГО, если вы пытаетесь создать заставку, есть лучшие способы сделать это. Но.. вот что вы просили:

using System.ComponentModel; //Remember to add this

public partial class MainWindow : Window
{
    private BackgroundWorker waitingWorker = new BackgroundWorker();
    private NewWindow myNewWindow = new NewWindow();

    public MainWindow()
    {
        InitializeComponent();

        waitingWorker.DoWork += waitingWorker_DoWork;
        waitingWorker.RunWorkerCompleted += waitingWorker_RunWorkerCompleted;

        waitingWorker.RunWorkerAsync();
    }

    private void waitingWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {
        myNewWindow.Show();
        this.Close();
    }

    private void waitingWorker_DoWork(object sender, DoWorkEventArgs e)
    {
        Thread.Sleep(5000);
    }
}

это простой фоновый рабочий, который ждет 5 секунд, затем открывает NewWindow и закрывает MainWindow. Да, вы можете сделать это и без фонового рабочего, но Thread.Sleep(5000); полностью заморозит ваш графический интерфейс и сделает ваше маленькое приложение не отвечающим, так что вам нужен другой поток, чтобы ждать, пока основной поток сможет поддерживать ваш графический интерфейс. Я предлагаю вам изучить хотя бы как работает фоновый работник.

ЗДЕСЬ официальная документация MSDN, но Google - ваш друг, и вы можете найти множество учебников и объяснений по этому поводу.

1) Во-первых, нам нужно остановиться MainWindow от открытия, как только мы запустим приложение. Для этого сначала удалите StartupUri="MainWindow.xaml" установка из App.xaml файл и замените его, установив Startup свойство вместо:

<Application x:Class="AppName.App"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Startup="App_Startup">

2) Затем добавьте обработчик для Application.Startup событие и запустить вашего ребенка (или заставку) Window:

private SplashScreen splashScreen;

...

public void App_Startup(object sender, StartupEventArgs e)
{
    // Open your child Window here
    splashScreen = new SplashScreen();
    splashScreen.Show();
}

3) На данный момент, есть несколько различных способов, в зависимости от того, нужно ли вам ждать SplashScreen Window делать что-нибудь или нет. В этом конкретном вопросе необходимо просто открыть MainWindow через 5 секунд, поэтому нам понадобится DispatcherTimer:

public void App_Startup(object sender, StartupEventArgs e)
{
    // Open your child Window here
    splashScreen = new SplashScreen();
    splashScreen.Show();
    // Initialise timer
    DispatcherTimer timer = new DispatcherTimer();
    timer.Interval = new TimeSpan(0, 5, 0);
    timer.Tick += Timer_Tick;
}

...

private void Timer_Tick(object sender, EventArgs e)
{
    splashScreen.Close();
    MainWindow mainWindow = new MainWindow();
    mainWindow.Show();
}

Вот и все.

Вот еще один способ сделать это:

Установите Startup на "App_Startup", как показано в одном из других сообщений.

    <Application x:Class="AppName.App"
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
     Startup="App_Startup">

И в App_OnStartup:

    private async void App_Startup(object sender, StartupEventArgs e)
    {
        var splash = new SplashWindow();
        splash.Show();

        await Task.Delay(5000);

        var mainWindow = new MainWindow();
        mainWindow.Show();
        splash.Close();

    }

Главное окно также должно быть загружено перед закрытием экрана-заставки. Таким образом, экран-заставка будет отображаться до тех пор, пока он загружается. Вы можете добавить дополнительное время в splashScreen.Close() Функция.

private SplashScreen splashScreen;

private void App_Startup(object sender, StartupEventArgs e)
{
    splashScreen = new SplashScreen("SplashScreen1.png"); // Or new WPF window
    splashScreen.Show(false);
    MainWindow mainWindow = new MainWindow();
    splashScreen.Close(new TimeSpan(0, 0, 3));
    mainWindow.Show();
}
Другие вопросы по тегам