c# - 在包含许多对象的大 Canvas 中拖动性能

标签 c# wpf performance xaml

我有一个很大的 Canvas ,上面有很多对象,它是可滚动的(这就是为什么它这么大)。 我在屏幕上放置了可以单击和拖动的对象(例如,文本框)。该对象只是捕获鼠标,并在调用 OnMouseMoved 事件时调用 Canvas.SetLeft() 和 SetTop()。

这适用于较小的 Canvas ,但这个有几千个对象的非常大的 Canvas 会非常缓慢地刷新拖动的对象......通常在拖动时刷新超过一秒钟。不是很用户友好。

我需要改进此购买但不确定如何改进。

我的一个想法是,在前景中保留一个透明 Canvas ,该 Canvas 仅是当前窗口大小并且不包含任何子项。当开始拖动时,将其移动到这一层直到完成并将其移回大层。尽管为另一个 hack 付出了很多努力......

更新:使用穿孔器,我看到 Canvas 在我拖动该对象时重复执行布局 channel ,这是缓慢的部分。想知道是否有任何方法可以避免这种情况...

最佳答案

性能优化不是“黑客”。大的优化通常涉及分解事物以便管理性能——这需要付出努力。

您的建议听起来很合理,但是当您“放下”您的项目并且 Canvas 刷新时,您所获得的延迟可能仍然会发生。另一种方法可能是创建一个“虚拟化” Canvas ,它只绘制当前屏幕上的内容。这是一项足够复杂的任务,我不会尝试在此处提供示例 - 但它可能会在整个过程中有益于您的应用程序的绘制性能。

关于c# - 在包含许多对象的大 Canvas 中拖动性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9265222/

相关文章:

performance - 使用 Hive 日期函数而不是硬编码日期字符串时,Hive 查询性能很慢?

c# - 保存实体时重复子条目

c# - 防止显示 Windows 安全窗口

C# 如何从父列表访问继承的对象

c# - 工作单元模式——管理父子关系

c# - 可视化 WPF 控件中的对象属性

performance - Node.JS 响应时间

结构和类之间的 C++ 区别 VS2015 中的初始化

c# - WPF 数据网格 : How to perform column binding using code behind?

c# - 将可观察集合绑定(bind)到上下文菜单