Как открыть дочернее окно, как заставку перед 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();
}