在我使用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
。这样可以更快地过渡。
当您使用OneWayBind
与ItemsControl
绑定时,系统会自动为您创建ViewModelViewHost
,ViewLocator
用于查找视图模型的视图。我认为由于某种原因这很慢。
有人知道如何在不必手动为ItemsControl定义大量数据模板的情况下解决这个性能问题吗?如果我有视图模型的视图模型的视图模型,那么事情会很快变得丑陋。根据我过去使用Caliburn.Micro
的经验,视图位置惯例非常快,所以我也想知道我是不是正确使用ReactiveUI
,并且还有另一种选择方法更快。
谢谢。
ViewModelViewHost
作为〜{30}视图模型的DataTemplate
会导致视图在最初加载时非常缓慢,使UI看起来好像已经崩溃了。有什么方法可以避免这种情况吗?
答案 0 :(得分:0)
我之前遇到过这个完全相同的问题。
基本上,你想显示/隐藏,而不是创建/销毁。
创建新的可视化树有很多工作,切换标签时通常会延迟几秒或更长时间。
现在,如果您创建了所有内容,然后折叠您不需要的内容并按需显示,突然之间所有内容都会更新。
执行此操作可能需要一些重构,并且代码可能看起来不干净,但它肯定会快速运行。