ReactiveUI-查看定位器性能
本文关键字:性能 定位器 ReactiveUI- | 更新日期: 2023-09-27 17:57:26
在使用ReactiveUI
的WPF
应用程序中,我注意到一个性能较差的区域。
我有一个视图模型,其中包含许多其他轻量级视图模型(想想30ish)。这些嵌套视图模型很简单,通常每个模型都表示一个按钮。它们都显示在用户控件中,位于使用ReactiveUI的OneWayBind
连接的ItemsControl
中。这意味着每个项目都使用ViewModelViewHost显示。
所以,问题是
在我功能强大的台式电脑上,当我导航到这个视图模型时,在按下";转到视图模型";按钮和视图发生变化,大约0.5秒。当我在Power PC上运行相同的软件时,延迟将近4秒。从用户体验的角度来看,这是一个相当大的问题。
我学到了什么
我试着分析和调试我的代码很长一段时间,没有发现任何问题。Zilch(注意:在VS中使用JustMyCode,因此ReactiveUI没有显示)。然而,我确实找到了解决这个问题的方法。我没有用OneWayBind
绑定到ItemsControl.ItemSource
,而是在XAML中这样做:ItemSource={Binding MyViewModels}
并手动设置DataTemplate
。这将导致更快的过渡。
当您使用OneWayBind
和ItemsControl
绑定时,会自动为您创建ViewModelViewHost
,并且ViewLocator
用于查找视图模型的视图。出于某种原因,我认为这是非常缓慢的。
问题
有人知道我如何在不必为ItemsControl手动定义大量数据模板的情况下绕过这一性能打击吗?如果我有视图模型的视图模型,那么事情往往会很快变得丑陋。根据我过去使用Caliburn.Micro
的经验,视图位置约定非常快,所以我也想知道我是否没有正确使用ReactiveUI
,并且有一种更快的替代方法。
谢谢。
TLDR
ViewModelViewHost
作为30个视图模型的DataTemplate
会导致视图在最初加载时非常缓慢,使UI看起来像崩溃了一样。有什么办法可以避免这种情况吗?
我认为这个问题的根本原因是TransitioningContentControl的实现问题。
此控件(到处都有许多现有的实现,其中大多数源于Silverlight一个AFAICT)在导航出内容时将导致额外的加载/卸载转换。
当前控件将在向外导航时触发"卸载/加载/卸载",而不是单个"卸载"。这个问题在很多地方都被提及。
在RxUI中使用时,此错误会导致在离开视图时调用WhenActivated
,从而导致性能问题,尤其是在当前视图很复杂的情况下。
TransitioningContentControl应该重写以避免这种额外的转换,这里有一个没有遇到这个问题的示例实现。
我以前也遇到过同样的问题。
本质上,您希望显示/隐藏,而不是创建/销毁。
创建一个新的可视化树是一项艰巨的工作,当您切换选项卡时,通常会延迟几秒钟或更长时间。
现在,如果你创造了一切,然后把你不需要的东西折叠起来,按需展示,突然间,一切都在眨眼之间更新了。
这可能需要一些重构,代码看起来可能不那么干净,但运行速度肯定非常快。