在 WPF 中渲染 UIElement 期间等待屏幕

问题描述 投票:0回答:2

我有一个使用 PRISM 的 WPF 应用程序。我有一个登录屏幕,成功登录后会出现一个包含包含许多项目的 TileListView 的新视图。这需要超过 10 秒的时间来渲染,因为控件必须进行大量计算等。所有这些都按标准行为使用 UI 线程,因为 WPF 中的渲染是在 UI 线程中完成的。是否可以在单独的窗口中显示一个像旋转器一样的 WaitControl 或只是一个简单的动画或类似的东西?现在到动画停止时,控件将在 UI 线程中渲染。

c# wpf ui-thread
2个回答
4
投票

您可以创建一个在单独线程中启动的新窗口。请参阅以下博客文章了解如何执行此操作的示例。

在单独的线程中启动 WPF 窗口: https://web.archive.org/web/20230128060513/http://reedcopsey.com/2011/11/28/launching-a-wpf-window-in -a-separate-thread-part-1/

然后,您只需在验证凭据之后和即将开始繁重渲染之前启动此线程,该线程会显示窗口。

这可能是你能做的最好的事情,而且也应该是一件很容易实现的事情。

编辑 - 包括上面链接中的代码,以供后代记录:

    using System.Threading;
    using System.Windows.Threading;

    void LoadWindowInThread()
    {
        Thread newWindowThread = new Thread(new ThreadStart(() =>
        {
            // Create our context, and install it:
            SynchronizationContext.SetSynchronizationContext(
                new DispatcherSynchronizationContext(
                    Dispatcher.CurrentDispatcher));

            // Create and configure the window
            Window1 tempWindow = new Window1();

            // When the window closes, shut down the dispatcher
            tempWindow.Closed += (s, e) =>
               Dispatcher.CurrentDispatcher.BeginInvokeShutdown(DispatcherPriority.Background);

            tempWindow.Show();
            // Start the Dispatcher Processing
            Dispatcher.Run();
        }));
        newWindowThread.SetApartmentState(ApartmentState.STA);
        // Make the thread a background thread
        newWindowThread.IsBackground = true;
        // Start the thread
        newWindowThread.Start();
    }

0
投票

您可以使用SplashScreen来显示,直到后台进程完成。请参阅此WPF 中的启动屏幕

© www.soinside.com 2019 - 2024. All rights reserved.