ReactiveUI - 查看定位器性能

2024-02-01

In my WPF使用的应用程序ReactiveUI,我注意到一个性能不佳的区域。

我有一个视图模型,其中包含许多其他轻量级视图模型(想想 30 左右)。这些嵌套视图模型很简单,通常每个代表一个按钮。它们都显示在用户控件内ItemsControl使用 ReactiveUI 进行连接OneWayBind。这意味着每个项目都使用显示视图模型视图主机 http://reactiveui.readthedocs.org/en/stable/basics/view-location/.

那么,问题

在我功能强大的台式电脑上,当我导航到此视图模型时,按下“转到视图模型”按钮和视图更改之间存在明显的延迟,大约 0.5 秒。当我在 Power-PC 上运行相同的软件时,延迟将近 4 秒。从用户体验的角度来看,这是一个相当大的问题。

我学到了什么

我尝试分析和调试我的代码很长时间,没有发现问题区域。齐尔奇(注:在 VS 中使用 JustMyCode 所以 ReactiveUI 没有出现)。不过,我确实找到了解决该问题的方法。而不是绑定到ItemsControl.ItemSource with OneWayBind,我在 XAML 中这样做,如下所示:ItemSource={Binding MyViewModels}并设置DataTemplate手动。这会导致更快的转换。

当你绑定OneWayBindItemsControl, a ViewModelViewHost会自动为您创建,并且ViewLocator用于查找视图模型的视图。我假设由于某种原因这非常慢。

Question

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

谢谢。

TLDR;

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


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

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

当前控件在导航出去时会触发 Unload/Load/Unload,而不是单次 Unload。这个问题参考了many https://social.msdn.microsoft.com/Forums/silverlight/en-US/17ca921c-f8e5-4bcc-8015-2c26f57fa78f/usercontrolloaded-event-fires-on-unload-of-control places https://github.com/firstfloorsoftware/mui/wiki/Handle-navigation-events.

当在RxUI中使用时,这个bug会导致WhenActivated在离开的视图上调用,导致性能问题,特别是在当前视图很复杂的情况下。

应重写 TransitioningContentControl 以避免这种额外的转换,here's https://github.com/oleksandrmelnychenko/CodeAnalyser/blob/master/SharePointCodeAnalyzer/SharePointCodeAnalyzer.CommonControls/Controls/TransitioningContentControl.cs一个不受此问题影响的示例实现。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ReactiveUI - 查看定位器性能 的相关文章

随机推荐