ReactiveUI-查看定位器性能

本文关键字:性能 定位器 ReactiveUI- | 更新日期: 2023-09-27 17:57:26

在使用ReactiveUIWPF应用程序中,我注意到一个性能较差的区域。

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

所以,问题是

在我功能强大的台式电脑上,当我导航到这个视图模型时,在按下";转到视图模型";按钮和视图发生变化,大约0.5秒。当我在Power PC上运行相同的软件时,延迟将近4秒。从用户体验的角度来看,这是一个相当大的问题。

我学到了什么

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

当您使用OneWayBindItemsControl绑定时,会自动为您创建ViewModelViewHost,并且ViewLocator用于查找视图模型的视图。出于某种原因,我认为这是非常缓慢的。

问题

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

谢谢。

TLDR

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

ReactiveUI-查看定位器性能

我认为这个问题的根本原因是TransitioningContentControl的实现问题。

此控件(到处都有许多现有的实现,其中大多数源于Silverlight一个AFAICT)在导航出内容时将导致额外的加载/卸载转换。

当前控件将在向外导航时触发"卸载/加载/卸载",而不是单个"卸载"。这个问题在很多地方都被提及。

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

TransitioningContentControl应该重写以避免这种额外的转换,这里有一个没有遇到这个问题的示例实现。

我以前也遇到过同样的问题。

本质上,您希望显示/隐藏,而不是创建/销毁。

创建一个新的可视化树是一项艰巨的工作,当您切换选项卡时,通常会延迟几秒钟或更长时间。

现在,如果你创造了一切,然后把你不需要的东西折叠起来,按需展示,突然间,一切都在眨眼之间更新了。

这可能需要一些重构,代码看起来可能不那么干净,但运行速度肯定非常快。