我有两个xaml。一个是MainWindow,另一个是NewWindow。 我希望在程序运行时显示NewWindow 5秒。 5秒后,我想要显示MainWindow。
如何在WPF中更改xaml?
这是MainWindow。
<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();
}
}
这是NewWindow。
<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();
}
}
答案 0 :(得分:4)
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
event的处理程序并启动您的孩子(或启动画面)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
做任何事情。在这个特定问题中,要求是在5秒后打开MainWindow
,因此我们需要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();
}
就是这样。
答案 1 :(得分:2)
有很多方法可以做到这一点。正如有些人建议我也建议如果你试图创建一个闪屏,就不要这样做,有更好的方法可以做到这一点。但是..这就是你要求的:
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);
将完全冻结你的GUI并使你的小应用程序无响应,所以你需要另一个线程等待,而主线程可以保持你的GUI活着。我建议你至少学习 后台工作者的工作方式。
HERE官方MSDN文档,但谷歌是你的朋友,你可以找到大量的教程和解释
答案 2 :(得分:0)
这是另一种方法:
将启动设置为&#34; App_Startup&#34;如其他一篇文章所示。
<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();
}
答案 3 :(得分:0)
在关闭splashScreen之前还应该加载mainWindow这样只要加载就会显示启动画面。您可以在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();
}