WPF启动画面直到Windows加载完成

6
我有一个应用程序,在窗口加载时消耗了很多时间。在Window_load事件中,我从数据库中读取一些控件的状态和名称。我想做一个启动画面,直到窗口完全加载后才结束。
我尝试过这个例子http://www.codeproject.com/KB/dialog/wpf_animated_text_splash.aspx,但是启动画面在主窗口完全加载之前就关闭了,我的主窗口出现了白屏,没有完全加载。
我是wpf的初学者,不知道如何拥有一个启动画面,直到主窗口完全加载才会消失。
请给我一个例子。
我的启动画面代码:
public partial class SplashWindow : Window
    {
        Thread loadingThread;
        Storyboard Showboard;
        Storyboard Hideboard;
        private delegate void ShowDelegate(string txt);
        private delegate void HideDelegate();
        ShowDelegate showDelegate;
        HideDelegate hideDelegate;

        public SplashWindow()
        {
            InitializeComponent();
            showDelegate = new ShowDelegate(this.showText);
            hideDelegate = new HideDelegate(this.hideText);
            Showboard = this.Resources["showStoryBoard"] as Storyboard;
            Hideboard = this.Resources["HideStoryBoard"] as Storyboard;

        }

        private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            loadingThread = new Thread(load);
            loadingThread.Start();
        }
        private void load()
        {
            Thread.Sleep(6000);

            this.Dispatcher.Invoke(showDelegate, "first data to loading");
            Thread.Sleep(6000);
            //load data 
            this.Dispatcher.Invoke(hideDelegate);

            Thread.Sleep(6000);
            this.Dispatcher.Invoke(showDelegate, "second data loading");
            Thread.Sleep(6000);
            //load data
            this.Dispatcher.Invoke(hideDelegate);


            Thread.Sleep(6000);
            this.Dispatcher.Invoke(showDelegate, "last data loading");
            Thread.Sleep(6000);
            //load data 
            this.Dispatcher.Invoke(hideDelegate);



            //close the window
            Thread.Sleep(6000);
            this.Dispatcher.Invoke(DispatcherPriority.Normal,(Action)delegate() { Close(); });
        }
        private void showText(string txt)
        {
            txtLoading.Text = txt;
            BeginStoryboard(Showboard);
        }
        private void hideText()
        {
            BeginStoryboard(Hideboard);
        }

    }

我将在我的MainWindow构造函数中调用这个启动画面:

new SplashWindow().ShowDialog();

但是我的 MainWindow 加载函数会在启动窗口完成显示后运行。

谢谢!

4个回答

30

如果您使用内置的SplashScreen类,您可以调用Show(false)来指定您将负责关闭启动画面。然后可以使用Close()方法来关闭它。

请注意,SplashScreen类仅支持显示静态图像。尽管如此,它也是有很好的原因的 - 为了在最短时间内让启动画面出现在用户面前。

代码看起来应该像这样:

static class Entry
{
    static void Main(string[] args)
    {
        var splashScreen = new SplashScreen("path/to/your/image.png");
        splashScreen.Show(false);

        InitializeLogging();
        InitializeServices();
        InitializeUserInterface();
        InitializeWhateverElseYouNeed();

        splashScreen.Close(TimeSpan.FromSeconds(1));
    }
}

我没有很好地理解你的回答。 - Animor
5
你不明白什么? - Kent Boogaart

7

动态闪屏(包括进度更新等)

为了获得最佳效果,您可以使用两个阶段的方法来实现 SplashScreen:

阶段 1. 在 .NET 代码开始加载之前显示静态闪屏。

使用本机代码加载静态图像,甚至在 .NET 初始化之前就完成。这样可以尽快地向用户提供信息。有一种特殊的方法可以实现此目的。

阶段 2. 显示自定义表单,一旦 .NET 加载完毕。

设计您的自定义表单,在初始显示时与您的静态闪屏完全相同。显示该表单将自动淡出第 1 阶段显示的静态闪屏(由 WPF 完成),从此您可以自由显示应用程序的加载进度。当您的主窗口完成数据加载后,请隐藏此表单(它可以是始终处于顶部的窗口)。


3
如果你的启动画面只是一张图片 - 将该图片添加到项目中,并将其“Build Action”属性设置为'SplashScreen'。框架将处理其余部分。(VS2008 sp1或更高版本)。
如果你需要不同的启动画面(也许显示版本号),这种方法将行不通。如果需要此功能,请查看SplashScreen类,它提供了更多的灵活性。

我已经尝试过了。它显示出图像,但之后出现了白色窗口和启动画面后面的内容。加载启动画面后,启动画面消失了。 - Animor

0

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