我正在开发一个项目,我想添加一个启动画面。我已经在Stackoverflow和其他博客以及MSDN等上检查了问题,但找不到我想要的解决方案。
我想要我的SplashScreen,
1-出现并在屏幕上停留3-4秒,但同时我希望我的主窗口不显示。当我的闪屏完全淡出时,应出现主窗口。我检查过的许多例子都没有实现。即使我设置了SplashScreen.Close。(TimeSpan.FromMiliseconds(4000))MainWindow仍然会立即在SplashScreen的前面或后面。他们说“为你的项目添加一个图像,使它成为Build Action SplashScreen或Resource,如果你想处理淡出时间去App.xaml.cs文件并实现你自己的Main()方法并把你的逻辑。”我已经知道了。它不起作用。
2-如果可能的话,我希望我的闪屏不要慢慢淡出。我希望它能够突然消失。(如果这对中级开发人员来说不可能或者很难做到,那就没关系。你可以忽视它。)
请我希望C#代码不是Xaml。我的项目基于WPF和.NET 4.0客户端配置文件。
谢谢。
答案 0 :(得分:4)
为什么不将启动画面设为完全合格的XAML <window>
,并在App.xaml中将其设置为StartupUri:
<Application x:Class="MyApp.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
StartupUri="SplashWindow.xaml">
然后在你的启动窗口的加载事件中,你初始化主窗口(最好是在其他地方,这样当你关闭飞溅时,实例会粘在一起)。从这里你还可以指定一个x秒的计时器,然后显示主窗口/隐藏启动窗口。
using System.Threading;
/// -------------------------------
private Timer t;
private void Window_Loaded(object sender, RoutedEventArgs e)
{
App.MainWindow = new MainWindow(); // Creates but wont show
t = new Timer(new TimerCallback(CloseSplash), null, new TimeSpan(0,0,10), new TimeSpan(0,0,0,0,-1));
// Do Other load stuff here?
}
private void CloseSplash(object info)
{
// Dispatch to UI Thread
Dispatcher.Invoke(DispatcherPriority.Normal, x => CloseSplashMain());
}
private void CloseSplashMain()
{
App.MainWindow.Show()
this.Close();
}
您必须更改应用程序的主窗口行为,否则关闭启动窗口将导致应用程序关闭。
public partial class App : Application
{
private void Application_Startup(object sender, StartupEventArgs e)
{
App.Current.ShutdownMode = ShutdownMode.OnLastWindowClose;
}
}
完成后也不要忘记丢弃计时器。它是一个IDisposable
并且会继续触发该方法,除非它被停止。
答案 1 :(得分:1)
有答案,但我发现一个更容易的答案。只需在主窗口的构造函数中使用Thread.Sleep(int miliSeconds)
方法即可。这将延迟您的应用程序,以便稍后打开指定的毫秒。
答案 2 :(得分:0)
在App.xaml.cs的构造函数中打开启动画面,等待几秒钟,然后关闭,然后再继续应用程序的其余部分。我正在使用Unity,因此在Boostrapper初始化某些服务之后,我在某处关闭了启动画面。
public partial class App : Application
{
private static SplashScreen _splashScreen;
public App()
{
OpenSplashScreen();
new Bootstrapper().Run();
}
private void OpenSplashScreen()
{
_splashScreen = new SplashScreen("SplashScreen/splash.jpg");
_splashScreen.Show(false);
}
internal static void CloseSplashScreen(double time)
{
_splashScreen.Close(TimeSpan.FromSeconds(0));
_splashScreen = null;
}
}
下面列出了Bootstrapper.cs:
public class Bootstrapper : UnityBootstrapper
{
protected override void ConfigureContainer()
{
base.ConfigureContainer();
var section = (UnityConfigurationSection)ConfigurationManager.GetSection("unity");
section.Configure(Container);
// initialize some services before
App.CloseSplashScreen(0);
}
protected override IModuleEnumerator GetModuleEnumerator()
{
return new ExtendedConfigurationModuleEnumerator();
}
protected override DependencyObject CreateShell()
{
MainWindow shell = new MainWindow(Container);
shell.Show();
return shell;
}
}
答案 3 :(得分:0)
使用API的最佳方法是
SplashScreen splash = new SplashScreen("splashscreen.jpg");
splash.Show(false);
splash.Close(TimeSpan.FromMilliseconds(2));
InitializeComponent();