在 WPF 中渲染 UIElement 期间等待屏幕
Wait screen during rendering UIElement in WPF
我有一个使用 PRISM 的 WPF 应用程序。我有一个登录屏幕,成功登录后会出现一个包含带有许多项目的 TileListView 的新视图。这需要超过 10 秒来渲染,因为控件必须计算很多等等。所有这些都使用标准行为的 UI 线程,因为 WPF 中的渲染是在 UI 线程中完成的。是否可以像微调器一样显示 WaitControl 或单独显示一个简单的动画 window 或类似的东西?现在到动画停止时,控件在 UI 线程中呈现。
您可以使用启动画面显示,直到后台进程完成。参考这个 Splash Screen in WPF
您可以创建一个在单独线程中启动的新 window。有关如何执行此操作的示例,请参阅以下博客 post。
在单独的线程中启动 WPF Window: http://reedcopsey.com/2011/11/28/launching-a-wpf-window-in-a-separate-thread-part-1/
然后您只需启动这个显示 window 的线程,就在您验证了凭据之后并且就在您的大量渲染即将开始之前。
这可能是您能做的最好的事情,而且应该也很容易实现。
编辑 - 包括来自上面 link 的代码,为 posterity 记录:
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();
}
我有一个使用 PRISM 的 WPF 应用程序。我有一个登录屏幕,成功登录后会出现一个包含带有许多项目的 TileListView 的新视图。这需要超过 10 秒来渲染,因为控件必须计算很多等等。所有这些都使用标准行为的 UI 线程,因为 WPF 中的渲染是在 UI 线程中完成的。是否可以像微调器一样显示 WaitControl 或单独显示一个简单的动画 window 或类似的东西?现在到动画停止时,控件在 UI 线程中呈现。
您可以使用启动画面显示,直到后台进程完成。参考这个 Splash Screen in WPF
您可以创建一个在单独线程中启动的新 window。有关如何执行此操作的示例,请参阅以下博客 post。
在单独的线程中启动 WPF Window: http://reedcopsey.com/2011/11/28/launching-a-wpf-window-in-a-separate-thread-part-1/
然后您只需启动这个显示 window 的线程,就在您验证了凭据之后并且就在您的大量渲染即将开始之前。
这可能是您能做的最好的事情,而且应该也很容易实现。
编辑 - 包括来自上面 link 的代码,为 posterity 记录:
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();
}