【问题标题】:How to properly display a splash screen如何正确显示启动画面
【发布时间】:2016-04-30 23:25:59
【问题描述】:

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

  1. 在构造函数中。

    WindowState = WindowState.Minimized;  // <---- for the mainWindow
    splashScreen.Show();
    
  2. 在 WindowViewBase_Loaded 事件中

    SetInterfaceElements(); // <-------interface customization (1)    
    splashScreen.Close();  
    WindowState = WindowState.Maximized; // (2)
    Activate(); // <------------------------to put focus on
    

最后效果总是一样的,所以 (1) 和 (2) 之间有一个差距。

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

【问题讨论】:

  • 这是启动画面吗?因为有一个内置的模板项。
  • 是的,但它有一些限制,请参阅我对以色列祭坛的回答的评论。

标签: c# wpf splash-screen


【解决方案1】:

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

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. 加载界面 2. 根据一些反序列化设置自定义它的问题。闪屏的目的(和主要的最小化)是为了隐藏这个差距。
  • @Luca 能否请您再次解释一下差距是什么,我从问题中没有理解...
  • 抱歉没有说清楚我会再解释一遍。操作是 1. 基于 xaml 制作标准接口 2. 反序列化数据(需要一些时间) 3. 根据反序列化数据自定义接口。所以最后,如果我不做某事,效果是首先我看到程序出现然后......跳!......它会根据反序列化的数据而变化。好丑!!
  • @Luca 只是为了明白我的意思,发生的情况是界面在用户眼前发生了变化,而这就是你想要阻止的?
  • 是的!你明白了。它有 _TEXTBOX1、_TEXTBOX2.... 等占位符,闪烁后它会正确更改为 Preferences、Users、... 这是因为我有一个运行时语言自定义、更改界面的用户偏好自定义。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多