【问题标题】:How to open a child Window like a splash screen before MainWindow in WPF?如何在 WPF 中的 MainWindow 之前像闪屏一样打开子窗口?
【发布时间】:2017-11-17 19:10:56
【问题描述】:

我有两个 xaml。一个是MainWindow,另一个是NewWindow。 我想在程序运行时显示 NewWindow 5 秒。 5 秒后,我想显示 MainWindow。

如何在 WPF 中更改 xaml?

这里是主窗口。

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

【问题讨论】:

  • 即你想显示一个启动画面?如果是,MSDN 包含如何执行此操作的说明。如果不是,请提供更详细的问题。
  • 使用计时器并打开NewWindow
  • 您可以发布一些您尝试过的代码。因为有几种方法可以做到这一点。
  • 是闪屏吗?
  • 我用 Expression Blend 制作了 NewWindow。因为习惯了加载屏幕。

标签: wpf


【解决方案1】:

1) 首先,我们需要在运行应用程序后立即阻止MainWindow 打开。为此,首先从App.xaml 文件中删除StartupUri="MainWindow.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();
}

就是这样。

【讨论】:

  • 非常感谢!! :)
  • 为了完成这项工作,应该在 Timer_Tick 方法中停止计时器。还应在显示主窗口后关闭 splashScreen。否则一个很好的解决方案。谢谢:-)
【解决方案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 文档,但谷歌是你的朋友,你可以找到大量的教程和解释

【讨论】:

  • 非常感谢!! :)
  • 如果它适合您,请将其标记为答案 ;)
【解决方案3】:

这是另一种方法:

将启动设置为“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();

    }

【讨论】:

    【解决方案4】:

    mainWindow 也应该在关闭 splashScreen 之前加载。这样,只要它正在加载,您的启动画面就会显示。您可以在 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();
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-09-01
      • 2011-06-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-26
      相关资源
      最近更新 更多