C# 反应UI-视图定位器性能

C# 反应UI-视图定位器性能,c#,wpf,performance,reactiveui,C#,Wpf,Performance,Reactiveui,在我使用ReactiveUI的WPF应用程序中,我注意到了一个性能较差的方面 我有一个视图模型,其中包含许多其他轻量级视图模型(想想30ish)。这些嵌套视图模型很简单,通常每个模型都表示一个按钮。它们都显示在用户控件中,ItemsControl中,该控件使用ReactiveUI的OneWayBind连接。这意味着每个项目都使用 所以,问题是 在我功能强大的台式电脑上,当我导航到此视图模型时,按下“转到视图模型”按钮和视图更改之间有一个明显的延迟,大约0.5秒。当我在Power PC上运行相同的

在我使用
ReactiveUI
WPF
应用程序中,我注意到了一个性能较差的方面

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

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

我学到的 我花了很长时间试着分析和调试我的代码,没有发现任何问题。Zillch(注意:在VS中使用JustMyCode,所以没有显示ReactiveUI)。然而,我确实找到了一种方法来消除这个问题。我没有使用
OneWayBind
绑定到
ItemsControl.ItemSource
,而是在XAML中这样做:
ItemSource={binding MyViewModels}
并手动设置
DataTemplate
。这将导致更快的转换

使用
OneWayBind
ItemsControl
绑定时,会自动为您创建一个
ViewModelViewHost
,并使用
ViewLocator
查找视图模型的视图。我认为这是非常缓慢的原因

问题: 有没有人知道我如何在不必为ItemsControl手动定义大量数据模板的情况下规避这一性能问题?如果我有视图模型的视图模型的视图模型,那么事情很快就会变得丑陋。根据我过去使用
Caliburn.Micro
的经验,视图位置约定非常快,因此我还想知道我是否没有正确使用
ReactiveUI
,还有一种更快的替代方法

多谢各位

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

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

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

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

现在,如果你创建了所有东西,然后折叠你不需要的东西并按需显示,突然所有东西都在眼球链接中更新


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

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

该控件(在各地都有许多现有的实现,其中大部分源于Silverlight one AFAICT)在从内容中导航时将导致额外的加载/卸载转换

当前控件将在导航出时触发卸载/加载/卸载,而不是单次卸载。此问题在中引用

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


TransitioningContentControl应该重新编写,以避免这个额外的转换,这是一个示例实现,不会出现这个问题。

我发现了同样的问题,并在找到并链接这个问题之前报告了它-我知道这个答案是旧的,但是如何实现您在上面发布的自定义
transitionContentControl
,以便WPF中的
RoutedViewHost
使用该类而不是默认控件呢?任何建议都将不胜感激。我相信您必须修补/PR RxUI以替换其impl,不能像那样注入有趣的-我很惊讶还没有PR。我已经看到多个实现似乎解决了这个问题。