Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Wpf 如何预渲染视图?_Wpf_Xaml - Fatal编程技术网

Wpf 如何预渲染视图?

Wpf 如何预渲染视图?,wpf,xaml,Wpf,Xaml,My ViewModel根据用户单击选择视图。其中一个视图包含许多可视元素—包含数据模板的viewmodels,其中包含数据模板的viewmodels,每个视图都使用背景图像笔刷在画布上渲染。整个视图以大约100个画布画笔结束,每个画笔上叠加了十几个椭圆,整个视图位于一个可滚动的viewbox中 第一次创建此视图时,用户单击会在所有视图渲染时挂起一段时间。我希望更早地完成此渲染-例如在启动期间。我已经创建了视图对象,但是当用户单击时,我们仍然会在渲染完成时挂起 有没有办法让WPF/xaml对其进

My ViewModel根据用户单击选择视图。其中一个视图包含许多可视元素—包含数据模板的viewmodels,其中包含数据模板的viewmodels,每个视图都使用背景图像笔刷在画布上渲染。整个视图以大约100个画布画笔结束,每个画笔上叠加了十几个椭圆,整个视图位于一个可滚动的viewbox中

第一次创建此视图时,用户单击会在所有视图渲染时挂起一段时间。我希望更早地完成此渲染-例如在启动期间。我已经创建了视图对象,但是当用户单击时,我们仍然会在渲染完成时挂起


有没有办法让WPF/xaml对其进行预渲染,从而使单击响应更好?

正如我看到的,您正在使用MVVM模式。我会尝试以下方法:

在启动期间创建视图,并将其
DataContext
设置为viewmodel实例。然后模拟WPF执行的工作。在视图上调用
Measure()
Arrange()
方法,强制WPF更新数据绑定并生成可视化树

但是只有一个UI线程。因此,在这一点上,会再次阻塞启动例程。您可以通过将“工作”分成更小的部分来避免这种情况。也许视图模型中有一些项集合。然后,您可以使用
DipatcherTimer
,在每个步骤中向集合添加一些合理数量的项,并在每次迭代后调用度量和排列,以更新视图的可视化树。
视图完全初始化后,渲染将不再阻塞。

啊,是的,我明白了-感谢您的指导。为清楚起见,在
initializeComponent()
之后,我调用了
this.Measure(新的System.Windows.Size(double.PositiveInfinity,double.PositiveInfinity))
this.Arrange(new System.Windows.Rect(new System.Windows.Size(layoutRoot.ActualWidth,layoutRoot.ActualHeight))在我视图的代码隐藏中。