如何在WPF中的MainWindow之前打开像启动画面一样的子窗口?

时间:2014-06-19 06:17:10

标签: wpf

我有两个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();
    }
}

4 个答案:

答案 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();
}