隐藏 WPF 窗口直到完全加载

8

对于我的WPF应用程序,我存储了几个用户设置,如窗口位置、窗口状态以及是否显示欢迎对话框。问题是,在所有内容加载完成之前,我看到很多闪烁和闪烁,当窗口在读取设置后最大化时,会出现更多的闪烁。

我已经使用内置的WPF PNG启动屏幕功能,但是否有一种方法可以完全隐藏所有窗口的渲染,直到所有内容完全加载完成?

4个回答

11

编辑Application.xaml,删除StartUpUri,改为设置StartUp事件处理程序。 在Application.xaml.cs中,编辑启动事件处理程序以显示启动画面、加载资源、创建所有内容,然后创建主窗口并显示它。

<Application
    ...
    StartUp="OnStartUp"
    />

并且:

private void OnStartUp(Object sender, StartupEventArgs e)
{
    var settings = LoadSettingsFrom... // Call your implementation of load user settings

    // Example only, in real app do this if's section on a different thread
    if (settings.doShowSplashScreen)
    {
        var splashScreen = new SplashScreen();
        splashScreen.Show();
    }

    // Load and create stuff (resources, databases, main classes, ...)

    var mainWindow = new mainWindow();
    mainWindow.ApplySettings(settings); // Call your implementation of apply settings

    if (doShowSplashScreen)
    {
        // send close signal to splash screen's thread
    }

    mainWindow.Show(); // Show the main window
}

我不明白。内置的启动画面功能是使用图像资源上的SplashScreen Build Action设置的。在引发Startup事件之前,将自动加载此内置的启动画面。在上面的代码中,正在创建一个新实例。那么自动的那个怎么办?如何关闭它?另外,上面引用了doSplashScreen。那是在哪里定义的?注意:我正在使用VB.NET。 - CyberMonk
我并没有假设使用任何内置的启动画面(功能1.在WPF 3.5 SP1中添加)。将图像的构建操作设置为SplashScreen仅会给您提供有限的功能,要禁用它,只需不将任何图像的构建操作设置为SplashScreen即可。doSplashScreen是伪代码 - 它可以是基于任何配置的检查(例如用户首选项)。 - Danny Varod
好的,谢谢。我感到困惑是因为原始问题陈述了“我已经在使用内置的WPF PNG启动屏幕功能”。你选择的名称进一步增加了混淆 - 内置的WPF启动屏幕也是一个名为SplashScreen的类。也许你应该在你的答案中更明确地说明这一点(或者使用不同的名称)。此外,展示你的解决方案比内置方案更好的原因会更好。 - CyberMonk
它首先启用显示启动画面,加载其他所有内容,然后再显示主窗口。此外,您的自定义启动画面可以包含任何自定义逻辑。 - Danny Varod

5
你可以将窗口的 WindowState 设置为 Minimized,然后处理 ContentRendered 事件并将 WindowState 设置为 Normal 或 Maximized。

1
最简单的方法,谢谢!我使用了Window_Loaded事件,这是我进行所有应用程序初始化的地方。当完成时,设置WindowState即可。 - Rob Campbell
干得好!简单而伟大。我还额外添加了内置启动画面。 - guan boshen
易于上手!谢谢 - clamchoda

3

有两个函数,BeginInit和EndInit,如果你在这些函数内部更改属性,比如...

BeginInit();
...
... // Do your code Initialization here...
...
EndInit();

如果不调用EndInit(),你的窗口将不会渲染,也不会闪烁。


这会导致它崩溃。 - user1034912

0

这个加载是在什么时候发生的?在主Window构造函数中执行的代码应该在窗口显示之前执行;如果您在那里加载任何必需的资源,您就不应该看到任何闪烁。


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