延迟启动画面的窗口

时间:2011-08-23 14:45:38

标签: c# wpf splash-screen

我正在开发一个项目,我想添加一个启动画面。我已经在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客户端配置文件。

谢谢。

4 个答案:

答案 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();