情况就是这样。我目前正在开发一个C#WPF桌面应用程序,我想在启动程序时添加一个启动画面。
但我没有使用SplashScreen类。我在同名应用程序的顶部使用了一个额外的WPF窗口类,我称之为Splashy类。
我的启动画面有一个动画GIF图像,在下面的Splashy类的WebBrowser控件上动画时效果很好...
<Image gif:ImageBehavior.AnimatedSource="Images/FSIntro.gif" Margin="10,1,0,10">
<Image.OpacityMask>
<ImageBrush ImageSource="Images/FSIntro.gif"/>
</Image.OpacityMask>
</Image>
...并且Splashy类本身在App.XAML中初始化为下面的StartupUri。
<Application
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
... ...
... (some text) ...
... ...
StartupUri="Splashy.xaml">
<Application.Resources>
但是这种情况的问题是启动画面只是挂起而不会进入主程序本身。
所以我尝试了另一种方法。一个使用代码。
当我将以下代码实现到启动画面然后将其实现到我的程序以运行启动画面然后显示主屏幕时,启动画面会执行我想要做的事情但它没有动画正如我想要的那样。
以下是Splashy类代码
public partial class Splashy : Window
{
public Intro()
{
InitializeComponent();
}
public void Outro()
{
this.Close();
}
}
以下是正在实施splashScreen的程序方法。
public partial class LoginScreen : Window
{
Splashy splash = new Splashy();
public LoginScreen()
{
splash.Show();
Thread.Sleep(5000);
splash.Outro();
// home screen
}
}
非常感谢任何指针和帮助。
答案 0 :(得分:1)
我会尝试这样的事情。创建一个处理所有这些逻辑的Bootstrapper
类。
public class BootStrapper
{
SplashScreen Splash = new SplashScreen();
MainWindow MainWindow = new MainWindow();
public void Start()
{
var timer = new DispatcherTimer();
timer.Interval = TimeSpan.FromSeconds(2);
timer.Tick += (s, e) =>
{
Splash.Close();
MainWindow.Show();
timer.Stop();
};
timer.Start();
Splash.Show();
}
}
从StartupUri
移除App.xaml
,以便不首先创建MainWindow
。
<Application x:Class="StackOverflow.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:StackOverflow"
StartupUri="MainWindow.xaml">
...变为
<Application x:Class="StackOverflow.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:StackOverflow">
然后,在App.xaml.cs
中,覆盖启动,以便创建Bootstrapper
类的新实例。
public partial class App : Application
{
protected override void OnStartup(StartupEventArgs e)
{
var bootStrapper = new BootStrapper();
bootStrapper.Start();
base.OnStartup(e);
}
}