ReactiveUI - 查看定位器性能

Bla*_*Box 5 c# wpf performance reactiveui

在我WPF使用 的应用程序中ReactiveUI,我注意到性能不佳的区域。

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

所以,问题

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

我学到了什么

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

当您使用OneWayBind与绑定时ItemsControl,将ViewModelViewHost自动为您创建一个,并且ViewLocator用于为您的视图模型查找视图。我假设由于某种原因这很慢。

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

谢谢你。

TLDR;

ViewModelViewHost作为DataTemplate用于〜30视图模式使视图最初加载时会很慢,使UI看起来好像已经崩溃。有什么办法可以避免这种情况吗?

Con*_*ngo 1

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

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

创建新的可视化树需要大量工作,并且在切换选项卡时通常会延迟数秒或更长时间。

现在,如果您创建了所有内容,然后折叠您不需要的内容并按需显示它,突然间所有内容都会更新。

可能需要进行一些重构才能做到这一点,并且代码可能看起来不那么干净,但它的运行速度确实非常快。