C# 在WPF中呈现UIElement期间等待屏幕

C# 在WPF中呈现UIElement期间等待屏幕,c#,wpf,ui-thread,C#,Wpf,Ui Thread,我有一个使用PRISM的WPF应用程序。我有一个登录屏幕,成功登录后,会出现一个新视图,其中包含一个包含许多项目的TileListView。这需要超过10秒的时间来渲染,因为控件必须计算大量数据等。所有这些都按照标准行为使用UI线程,因为WPF中的渲染是在UI线程中完成的。有没有可能在单独的窗口中显示一个像微调器一样的WaitControl或者只是一个简单的动画或者类似的东西?现在,动画在此时停止,控件在UI线程中呈现。您可以使用SplashScreen显示,直到后台处理完成。参考此您可以使用S

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

您可以使用SplashScreen显示,直到后台处理完成。参考此

您可以使用SplashScreen显示,直到后台处理完成。参考此

您可以创建一个在单独线程中启动的新窗口。请参考下面的博客文章,了解如何做到这一点

在单独的线程中启动WPF窗口:

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

这可能是您能做的最好的事情,而且应该是一件非常容易实现的事情

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

使用系统线程; 使用System.Windows.Threading; void LoadWindowInThread { 线程newWindowThread=新线程新线程开始=> { //创建并安装我们的上下文: SynchronizationContext.SetSynchronizationContext 新DispatcherSynchronizationContext Dispatcher.CurrentDispatcher; //创建并配置窗口 Window1 tempWindow=新Window1; //当窗口关闭时,关闭调度程序 tempWindow.Closed+=s,e=> Dispatcher.CurrentDispatcher.BeginInvokeShutdownDispatcherPriority.Background; 临时窗口显示; //启动调度程序处理 调度程序。运行; }; newWindowThread.setApartmentState.STA; //使线程成为背景线程 newWindowThread.IsBackground=true; //开线 newWindowThread.Start; }
您可以创建一个在单独线程中启动的新窗口。请参考下面的博客文章,了解如何做到这一点

在单独的线程中启动WPF窗口:

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

这可能是您能做的最好的事情,而且应该是一件非常容易实现的事情

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

使用系统线程; 使用System.Windows.Threading; void LoadWindowInThread { 线程newWindowThread=新线程新线程开始=> { //创建并安装我们的上下文: SynchronizationContext.SetSynchronizationContext 新DispatcherSynchronizationContext Dispatcher.CurrentDispatcher; //创建并配置窗口 Window1 tempWindow=新Window1; //当窗口关闭时,关闭调度程序 tempWindow.Closed+=s,e=> Dispatcher.CurrentDispatcher.BeginInvokeShutdownDispatcherPriority.Background; 临时窗口显示; //启动调度程序处理 调度程序。运行; }; newWindowThread.setApartmentState.STA; //使线程成为背景线程 newWindowThread.IsBackground=true; //开线 newWindowThread.Start; }
有没有可能进行重构,使UI内容绑定到在后台线程中执行计算后分配的DependencyProperties?似乎这可能是一个问题,UI线程上发生了太多的事情,控件来自Telerik,因此我无法修改:/I明白了。同一窗口中的微调器肯定无法正常工作,因为它的旋转动画会发生在同一个陷入困境的UI线程上,所以旋转不好。但是,也许你的想法是创建另一个窗口或覆盖的东西可能会起作用。您只需知道控件何时完成加载。你能再解释一下控件在计算什么吗?这可能有助于我们确定另一种解决方案我不知道控件中发生了什么。我唯一要传递的是通过绑定到ViewModel的ItemsSource。此对象仅包含有关平铺描述的信息,但这不是问题所在。它可以是渲染速度慢的任何控件..谢谢。这是否意味着传入的项在UI线程本身上什么都不做,但它们中有成千上万的项
其中有多少?数百万人?TileListView无法快速处理所有这些问题?是否可以进行重构,使UI内容绑定到后台线程中执行计算后分配的DependencyProperties?似乎这可能是一个问题,UI线程上发生了太多的事情,控件来自Telerik,因此我无法修改:/I明白了。同一窗口中的微调器肯定无法正常工作,因为它的旋转动画会发生在同一个陷入困境的UI线程上,所以旋转不好。但是,也许你的想法是创建另一个窗口或覆盖的东西可能会起作用。您只需知道控件何时完成加载。你能再解释一下控件在计算什么吗?这可能有助于我们确定另一种解决方案我不知道控件中发生了什么。我唯一要传递的是通过绑定到ViewModel的ItemsSource。此对象仅包含有关平铺描述的信息,但这不是问题所在。它可以是渲染速度慢的任何控件..谢谢。这是否意味着传入的项目本身在UI线程上什么都不做,但它们中有这么多,成千上万?数百万人?TileListView无法快速处理所有问题?