我已通过以下方式创建了SplashScreen
:
创建了一个新窗口,其中包含一些控件,例如未终止的进度条,用于显示加载和标签
将此代码添加到启动画面窗口:
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();
}
但是主窗口没有显示
答案 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
来管理何时关闭它,最后显示主窗口本身。