ReactiveUI - 查看定位器性能

时间:2015-06-19 19:55:12

标签: c# wpf performance reactiveui

在我使用WPF的{​​{1}}申请中,我发现了一个表现不佳的领域。

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

所以,问题

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

我学到了什么

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

当您使用OneWayBindItemsControl绑定时,系统会自动为您创建ViewModelViewHostViewLocator用于查找视图模型的视图。我认为由于某种原因这很慢。

问题

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

谢谢。

TLDR;

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

1 个答案:

答案 0 :(得分:0)

我之前遇到过这个完全相同的问题。

基本上,你想显示/隐藏,而不是创建/销毁。

创建新的可视化树有很多工作,切换标签时通常会延迟几秒或更长时间。

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

执行此操作可能需要一些重构,并且代码可能看起来不干净,但它肯定会快速运行。