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 - 查看定位器性能 的相关文章

  • ProtoBuf-net AsReference 需要 Activator.CreateInstance 中的公共构造函数吗?

    在我的两门课程中 看起来像这样 最少 using System using System Collections Generic using System Collections using System ComponentModel us
  • C++ 有像 Pascal 一样的“with”关键字吗?

    withPascal 中的关键字可用于快速访问记录的字段 有人知道 C 是否有类似的东西吗 前任 我有一个包含许多字段的指针 但我不想这样输入 if pointer gt field1 pointer gt field2 pointer g
  • C/C++ 中随机数生成器的实现[重复]

    这个问题在这里已经有答案了 我对 C 中随机数生成器的实现有点困惑 它也与 C 中的明显不同 如果我理解正确 对 srand seed 的调用会以某种方式初始化可通过 rand 访问的隐藏变量 种子 该变量又将函数指向预先生成的序列 例如例
  • 禁用除滚动之外的 DataGridView

    我如何配置 datagridview 以便用户只能在行中移动并使用滚动 而没有其他 如果我禁用网格不允许我使用滚动 将您的 datagridview 设置为只读 这将禁用任何编辑 dataGridView1 ReadOnly true 在你
  • 使用 Microsoft Graph 创建用户

    如何使用 Microsoft graph 创建用户 因为我在保存过程中遇到了权限失败的问题 我确实有几个问题 在图中调用创建用户 API 将在哪里创建用户 是在 Azure AD 还是其他地方 我尝试通过传递 json 和必需的标头来调用创
  • C++ 析构函数:何时释放内存?

    如果我删除一个导致其析构函数被调用的对象 那么内存是在析构函数完成函数中的任何操作之前还是之后被释放 仅当最小派生类子对象被销毁后才会释放内存 所以如果你有 class Base class Derived public Base publ
  • 在 C++ 中处理音频缓冲区时,如何执行从 float -> double -> float 的转换

    我目前正在开发一个应用程序 其中音频样本帧在以下回调中进行处理 void Eav07AudioProcessor processBlock AudioSampleBuffer buffer for int channel 0 channel
  • ASP MVC 5 - 403 customError 不起作用

    我正在尝试为我的应用程序创建自定义错误页面 它在大部分情况下都有效 但不适用于403 errors 我的网络配置
  • 使用对象列表构建树

    我有一个带有属性 id 和parent id 的对象列表 我想建造一棵树来连接那些孩子和父母 1 个父对象可以有多个子对象 并且有一个对象将成为所有对象的祖先 实现该功能最快的算法是什么 我使用 C 作为编程语言 但其他语言也可以 像这样的
  • AspNetCore.SignalR:无法启动未处于初始状态的连接

    我无法让 ASP NET Core SignalR 应用程序正常运行 我有这个服务器端代码 public class PopcornHub Hub private int Users public async Task BroadcastN
  • ASP.NET Web API Swagger(Swashbuckle)重复OperationId

    I have a web api controller like below In swagger output I am having the below image And when I want to consume it in my
  • .NET 的 HttpWebResponse 是否会自动解压缩 GZiped 和 Deflated 响应?

    我正在尝试执行一个接受压缩响应的请求 var request HttpWebRequest HttpWebRequest Create requestUri request Headers Add HttpRequestHeader Acc
  • 使 C# 编译器相信执行将在成员返回后停止

    我认为目前这是不可能的 或者这是否是一个好主意 但这是我刚才正在考虑的事情 我使用 MSTest 对我的 C 项目进行单元测试 在我的一项测试中 我执行以下操作 MyClass instance try instance getValue
  • 向每个收件人发送一封包含不同内容的电子邮件(使用抄送字段)

    在你因为这个问题 毫无意义 和 不可能 而驳回之前 请听我说完 问题 我们在使用我们的系统发送的每封电子邮件中实施跟踪像素 即具有唯一 URL 的可下载 GIF 文件 这有助于我们跟踪电子邮件的打开情况 问题是 当我们抄送一些收件人时 跟踪
  • 如何在Linux上构建GLFW3项目?

    我已经使用 cmake 和 make 编译了 glfw3 和包含的示例 没有出现任何问题 开始编写我的第一个项目 作为 opengl 和 glfw 的新手 并且对 C 和 CMake 没有经验 我正在努力理解示例构建文件 甚至要链接哪些库和
  • 为什么从绑定返回的对象会忽略额外的参数?

    假设我有一个带有两个参数的函数 void f int x int y 我想绑定其中之一 我可以用std bind如下 auto partiallyBoundF std bind f 10 1 partiallyBoundF仅需要一个参数 但
  • 获取大于某个数字的元素个数

    我正在尝试解决以下问题 数字被插入到容器中 每次插入数字时 我需要知道容器中有多少元素大于或等于当前插入的数字 我相信这两个操作都可以以对数复杂度完成 我的问题 C 库中有标准容器可以解决这个问题吗 我知道std multiset可以在对数
  • 计算两个日期之间的工作日数?

    在C 中 如何计算business 或工作日 两个日期之间的天数 我以前曾经遇到过这样的任务 并且我已经找到了解决方案 当可以避免的时候 我会避免列举其间的所有日子 这里就是这种情况 正如我在上面的一个答案中看到的那样 我什至没有提到创建一
  • 如何设置 Swashbuckle 与 Microsoft.AspNetCore.Mvc.Versioning

    我们有asp net core webapi 我们添加了Microsoft AspNetCore Mvc Versioning and Swashbuckle拥有招摇的用户界面 我们将控制器指定为 ApiVersion 1 0 Route
  • XmlDocument Save 使文件保持打开状态

    我有一个简单的 C 函数 可以创建一个基本的 XML 文件并保存 private void CreateXMlFile string Filename string Name string Company XmlDocument doc n

随机推荐