c# – ReactiveUI – 查看定位器性能

在我使用ReactiveUI的
WPF应用程序中,我注意到一个性能不佳的领域.

我有一个视图模型,其中包含许多其他轻量级视图模型(想想30ish).这些嵌套的视图模型很简单,通常每个都代表一个按钮.它们都显示在用户控件中,在使用ReactiveUI的OneWayBind连接的ItemsControl中.这意味着每个项目都使用ViewModelViewHost显示.

那么,问题

在我强大的桌面PC上,当我导航到这个视图模型时,按下“视图模型”按钮和视图更改之间会有明显的延迟,大约0.5秒.当我在Power-PC上运行相同的软件时,延迟接近4秒.从UX的角度来看,这是一个非常大的问题.

我学到了什么

我在很长一段时间内尝试过剖析和调试我的代码,发现没有问题. Zilch(注意:在VS中使用JustMyCode,因此ReactiveUI没有出现).但是,我确实找到了解决问题的方法.我没有使用OneWayBind绑定到ItemsControl.ItemSource,而是在XAML中这样做:ItemSource = {Binding MyViewModels}并手动设置DataTemplate.这导致更快的转换.

使用ItemsControl与OneWayBind绑定时,会自动为您创建ViewModelViewHost,并使用ViewLocator查找视图模型的视图.我认为由于某种原因这很慢.

是否有人知道如何在不必手动为ItemsControl定义大量数据模板的情况下解决这个性能问题?如果我有视图模型的视图模型的视图模型,那么事情会很快变得丑陋.根据我过去使用Caliburn.Micro的经验,视图位置约定非常快,所以我也想知道我是不是正确使用ReactiveUI,并且有一种更快的替代方法.

谢谢.

TLDR;

ViewModelViewHost作为〜30个视图模型的DataTemplate导致视图在最初加载时非常缓慢,使UI看起来好像已经崩溃了.有什么方法可以避免这种情况吗?

最佳答案 我认为这个问题的根本原因是TransitioningContentControl的实现问题.

此控件(其中包含许多现有实现,其中大部分源自Silverlight one AFAICT)将导出内容时导致额外的加载/卸载转换.

导航时,当前控件将触发卸载/加载/卸载,而不是单个卸载.此问题在many places中引用.

在RxUI中使用时,此错误会导致在离开View时调用WhenActivated,从而导致性能问题,尤其是在当前视图很复杂的情况下.

应该重写TransitioningContentControl以避免这种额外的转换,here’s是一个不受此问题影响的示例实现.

点赞