Splashscreen没有显示

时间:2018-01-26 21:32:39

标签: c# wpf

我已通过以下方式创建了SplashScreen

  1. 创建了一个新窗口,其中包含一些控件,例如未终止的进度条,用于显示加载和标签

  2. 将此代码添加到启动画面窗口:

  3. ResizeMode="NoResize" WindowStyle="None" WindowStartupLocation="CenterScreen" Background="Blue" BorderThickness="5" BorderBrush="AliceBlue"

    然后在我的App.xaml.cs中我在OnStartup中写了这个:

    SplashScreen splash = new SplashScreen();  
    splash.Show();  
    
    MainWindow main = new MainWindow();   
    
    for (int i = 0; i < 100; i++)  
    {  
        Thread.Sleep(i);  
    }  
    
    splash.Close();  
    
    main.Show();  
    

    现在问题是启动画面没有显示,似乎应用程序正忙或类似的东西,为什么?

    更新:

    我按照建议编写了这段代码:

    private void _applicationInitialize(Views.SplashScreen splashWindow)
        {
            var dispatcherTimer = new DispatcherTimer();
            dispatcherTimer.Tick += new EventHandler(dispatcherTimer_Tick);
            dispatcherTimer.Interval = new TimeSpan(0, 0, 1);
            dispatcherTimer.Start();
    
            //Dispatcher.BeginInvoke(DispatcherPriority.Normal, (Invoker)delegate
            //{
            //    MainWindow = new MainWindow();
            //    MainWindow.Show();
            //});
        }
    
        private void dispatcherTimer_Tick(object sender, EventArgs e)
        {
            MainWindow = new MainWindow();
            MainWindow.Show();
        }
    

    但是主窗口没有显示

2 个答案:

答案 0 :(得分:0)

由于您使用的是Thread.Sleep并且您的启动画面位于同一个线程上,因此您将无法看到它。可能重复WPF SplashScreen with ProgressBar

答案 1 :(得分:0)

我认为问题是Thread.Sleep方法会导致UI线程休眠,直到循环完成。最好将DispatcherTimer用于此类事情,这将启动后台线程。

当引发Tick上的DispatcherTimer事件时,您可以关闭启动画面窗口。

请参阅以下链接,了解其用法示例:https://msdn.microsoft.com/en-us/library/system.windows.threading.dispatchertimer.aspx

修改

在问题中编辑的代码中,我意识到DispatcherTimer变量是一个方法范围的变量,它应该是一个类级别的范围变量。以下是半伪代码,但应指导如何设置行为:

public class Program
{
    // This is a very rough snippet of the application startup piece. Its psuedo-code.
    public void Main()
    {
        var mainWindow = new MainWindow();

        App.Run(mainWindow);
    }
}

public class MainWindow : Window
{
    private DispatcherTimer dispatcherTimer;
    private Window splashWindow;

    public MainWindow()
    {
        this.splashWindow = new SplashWindow();
        this.splashWindow.Show();

        this.dispatcherTimer = new DispatcherTimer();
        dispatcherTimer.Tick += new EventHandler(dispatcherTimer_Tick);
        dispatcherTimer.Interval = new TimeSpan(0, 0, 1);
        dispatcherTimer.Start();
    }

    private void dispatcherTimer_Tick(object sender, EventArgs e)
    {
        this.splashWindow.Close();
        this.mainWindow.Show();
    }
}

简而言之,我们的想法是让主窗口控制启动窗口的显示。所以我让主窗口创建了一个启动窗口的实例,然后使用DispatcherTimer来管理何时关闭它,最后显示主窗口本身。