如何正确显示启动画面
How to properly display a splash screen
我想在我的应用程序中显示启动画面,因为我必须读取磁盘上的一些数据并相应地自定义界面。如果我没有,效果就是加载界面然后自定义,效果清晰可见。所以我的想法是定义一个 globla 初始屏幕 window 和:
在构造函数中。
WindowState = WindowState.Minimized; // <---- for the mainWindow
splashScreen.Show();
在 WindowViewBase_Loaded 事件中
SetInterfaceElements(); // <-------interface customization (1)
splashScreen.Close();
WindowState = WindowState.Maximized; // (2)
Activate(); // <------------------------to put focus on
最终效果总是一样的,所以 (1) 和 (2) 之间存在差距。
于是想到刷新的问题。我试图用 UpdateLayout 强制它但没有运气。所以从 here 另一个解决方案但总是一样的。我错过了什么吗??
您需要做的是创建启动画面class并封装其所有功能。此外,您需要通过线程激活闪屏,如下所示:
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();
这样你就不需要最大化和最小化你的window。
就个人而言,我会在应用程序初始化时将启动画面设置为主窗口,在启动画面的加载回调中执行所需的加载 window,然后打开并更改实际的主窗口。这样你就不必为 threads/ui 冻结而烦恼。
在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();
}
}
我想在我的应用程序中显示启动画面,因为我必须读取磁盘上的一些数据并相应地自定义界面。如果我没有,效果就是加载界面然后自定义,效果清晰可见。所以我的想法是定义一个 globla 初始屏幕 window 和:
在构造函数中。
WindowState = WindowState.Minimized; // <---- for the mainWindow splashScreen.Show();
在 WindowViewBase_Loaded 事件中
SetInterfaceElements(); // <-------interface customization (1) splashScreen.Close(); WindowState = WindowState.Maximized; // (2) Activate(); // <------------------------to put focus on
最终效果总是一样的,所以 (1) 和 (2) 之间存在差距。
于是想到刷新的问题。我试图用 UpdateLayout 强制它但没有运气。所以从 here 另一个解决方案但总是一样的。我错过了什么吗??
您需要做的是创建启动画面class并封装其所有功能。此外,您需要通过线程激活闪屏,如下所示:
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();
这样你就不需要最大化和最小化你的window。
就个人而言,我会在应用程序初始化时将启动画面设置为主窗口,在启动画面的加载回调中执行所需的加载 window,然后打开并更改实际的主窗口。这样你就不必为 threads/ui 冻结而烦恼。
在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();
}
}