WPF启动屏幕(SplashScreen)何时关闭?

3
我正在制作一个自定义启动画面(因为标准启动画面不符合我的需求)。但是有一个选项我想要实现——自动关闭。但是为了实现它,我需要了解常见的SplashScreen是如何选择关闭时机的。
那么,是否有任何事件可以向启动画面发送消息,告诉它应该关闭呢?至少常见的启动画面使用什么事件?

明确地关闭它。通常有一个主窗口,在渲染启动画面时关闭它(在WPF中是ContentRendered事件)。如果您愿意深入了解,这里SplashScreen的源代码。 - Sinatr
你为什么特别提到Visual Studio? - DerApe
@Sinatr:已注意到。从未遇到过这种情况。已删除。 - C4d
@derape,在这个问题中,我指的是标准的启动屏幕,它实际上是Visual Studio的一个特性(或者至少是其中的C#部分)。 - lentinant
@derape 我认为这是一种假设,因为WPF应用程序是在Visual Studio中构建的,所以WPF的东西就成为了"Visual Studio的特性"。此外,该问题确实链接到了WPF中存在的SplashScreen(我也承认我之前没有听说过)。 - anaximander
显示剩余2条评论
2个回答

4
WPF SplashScreen类使用一个非常简单的技巧,它调用Dispatcher.BeginInvoke()。期望的是UI线程正在忙于初始化程序,因此不会分发任何内容。它“挂起”了。当然不是永远挂起,一旦完成,它就重新进入分派程序循环,现在BeginInvoked方法有机会运行,ShowCallback()方法运行。命名不当,应该是“CloseCallback”:) 0.3秒的淡出掩盖了任何额外的延迟,以使主窗口呈现。
通常,在UI线程上调用Dispatcher.BeginInvoke()看起来像是一个奇怪的黑客,但非常有用。解决棘手的重入问题的绝佳方式。
非常简单,不是唯一的方法。主窗口的Load事件可能是一个有用的触发器。

2

与其将Build Action设置为Splash Screen的图像文件,您可以通过在应用程序的OnStartup事件处理程序中创建并显示自己的启动屏幕来更好地控制启动屏幕。SplashScreen的show方法有一个参数,可以阻止其自动关闭,然后您可以使用Close方法告诉它何时关闭:

首先从App.xaml中删除StartupUri标签:

<Application x:Class="Splash_Screen.App" 
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
    <Application.Resources> 

    </Application.Resources> 
</Application>

将图像文件的构建操作(Build Action)更改为资源(Resource)

然后在OnStartup事件处理程序中创建并显示启动画面:

public partial class App : Application 
    { 
        private const int MINIMUM_SPLASH_TIME = 1500; // Miliseconds 
        private const int SPLASH_FADE_TIME = 500;     // Miliseconds 

        protected override void OnStartup(StartupEventArgs e) 
        { 
            // Step 1 - Load the splash screen 
            SplashScreen splash = new SplashScreen("splash.png"); 
            splash.Show(false, true); 

            // Step 2 - Start a stop watch 
            Stopwatch timer = new Stopwatch(); 
            timer.Start(); 

            // Step 3 - Load your windows but don't show it yet 
            base.OnStartup(e); 
            MainWindow main = new MainWindow(); 

            // Step 4 - Make sure that the splash screen lasts at least two seconds 
            timer.Stop(); 
            int remainingTimeToShowSplash = MINIMUM_SPLASH_TIME - (int)timer.ElapsedMilliseconds; 
            if (remainingTimeToShowSplash > 0) 
                Thread.Sleep(remainingTimeToShowSplash); 

            // Step 5 - show the page 
            splash.Close(TimeSpan.FromMilliseconds(SPLASH_FADE_TIME)); 
            main.Show(); 
        } 
    }

谢谢回答,但实际上我有意建立自己的启动画面(可以随时显示或隐藏)。默认的启动画面会在应用程序窗口加载时淡出(不早不晚)。所以问题是 - 他如何知道何时淡出。 - lentinant
你必须自己控制。我会展示启动画面一段时间(例如3秒),然后展示主窗口。我猜你想在主窗口准备好展示后立即展示主窗口并关闭启动画面。这可能是立即的,但完全取决于在展示主窗口之前你正在做什么。加载数据等操作完成后,调用SplashScreen.Close和MainWindow.Show。 - Glen Thomas
好的,在尝试了一些实验后,你的解决方案让我有了前进的方向。现在,我正在应用程序构造函数中创建闪屏,然后在OnStartup中关闭它。实际上,这引发了一个非常奇怪的错误,但这是另一个问题。 - lentinant

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接