如何正确显示启动画面

时间:2016-04-18 07:57:12

标签: c# wpf splash-screen

我想在我的应用中显示启动画面,因为我必须在磁盘上读取一些数据并相应地自定义界面。如果我没有效果,那么界面被加载然后定制,效果清晰可见。所以我的想法是定义一个globla启动画面窗口并且:

  1. 在构造函数中。

    WindowState = WindowState.Minimized;  // <---- for the mainWindow
    splashScreen.Show();
    
  2. WindowViewBase_Loaded事件中的
  3. SetInterfaceElements(); // <-------interface customization (1)    
    splashScreen.Close();  
    WindowState = WindowState.Maximized; // (2)
    Activate(); // <------------------------to put focus on
    
  4. 最后效果始终相同,因此(1)和(2)之间存在差距。

    所以我想到了一个刷新问题。我试图用UpdateLayout强制它,但没有运气。所以从here另一个解决方案,但始终相同。我错过了什么吗?

3 个答案:

答案 0 :(得分:2)

您需要做的是创建一个启动画面类并封装其所有功能。此外,您需要通过线程激活启动屏幕,如下所示:

public static class SplashScreenView
{
    public static Show()
    {
    Thread thread = new Thread(() =>
            {
                splashScreenView = new SplashScreenView();
                ....
            }
            // you code
            thread.Start();
    }

    public static Close()
    {
     // close splash screen code
    }
}

之后你的代码就像那样:

SplashScreenView.Show();
// all your code
SplashScreenView.Close();

这样您就不需要最大化并最小化窗口。

答案 1 :(得分:1)

我个人会在应用程序初始化时将Splash设置为MainWindow,在启动窗口的加载回调中执行所需的加载,然后打开+更改实际的MainWindow。这样你就不必为线程/ ui冻结而烦恼了。

答案 2 :(得分:1)

在mainView构造函数中

public MainView()
{
  SplashScreen splashScreen = new SplashScreen();
  splashScreen.Show();
  ...
}

然后

Action emptyDelegate = delegate { };
bool IsContentRendered = false;
private void WindowViewBase_Loaded(object sender, RoutedEventArgs e)
{
        SetInterfaceElements();
        Dispatcher.Invoke(emptyDelegate, DispatcherPriority.Render);<---to refresh
        IsContentRendered = true;
}

最后

private void WindowViewBase_ContentRendered(object sender, EventArgs e)
{
 if (IsContentRendered)
    {
        if (splashScreen != null)
         splashScreen.Close();
        WindowState = WindowState.Maximized;
        Activate();
    }
}