我有一个很大的 Canvas ,上面有很多对象,它是可滚动的(这就是为什么它这么大)。 我在屏幕上放置了可以单击和拖动的对象(例如,文本框)。该对象只是捕获鼠标,并在调用 OnMouseMoved 事件时调用 Canvas.SetLeft() 和 SetTop()。
这适用于较小的 Canvas ,但这个有几千个对象的非常大的 Canvas 会非常缓慢地刷新拖动的对象......通常在拖动时刷新超过一秒钟。不是很用户友好。
我需要改进此购买但不确定如何改进。
我的一个想法是,在前景中保留一个透明 Canvas ,该 Canvas 仅是当前窗口大小并且不包含任何子项。当开始拖动时,将其移动到这一层直到完成并将其移回大层。尽管为另一个 hack 付出了很多努力......
更新:使用穿孔器,我看到 Canvas 在我拖动该对象时重复执行布局 channel ,这是缓慢的部分。想知道是否有任何方法可以避免这种情况...
最佳答案
性能优化不是“黑客”。大的优化通常涉及分解事物以便管理性能——这需要付出努力。
您的建议听起来很合理,但是当您“放下”您的项目并且 Canvas 刷新时,您所获得的延迟可能仍然会发生。另一种方法可能是创建一个“虚拟化” Canvas ,它只绘制当前屏幕上的内容。这是一项足够复杂的任务,我不会尝试在此处提供示例 - 但它可能会在整个过程中有益于您的应用程序的绘制性能。
关于c# - 在包含许多对象的大 Canvas 中拖动性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9265222/