【发布时间】:2012-02-13 17:41:38
【问题描述】:
我有一个大画布,上面有很多对象,可以滚动(因此它这么大)。 我在屏幕上放置了可以单击和拖动的对象(例如,文本框)。该对象只是捕获鼠标,并在调用 OnMouseMoved 事件时调用 Canvas.SetLeft() 和 SetTop()。
这适用于较小的画布,但这个具有几千个对象的非常大的画布刷新拖动的对象非常缓慢......通常在拖动时刷新超过一秒。不是很用户友好。
我需要改进这个购买不知道如何进行。
我的一个想法是,在前景中保留一个透明画布,它只有当前窗口大小并且不包含子级。开始拖动时,将其移动到该图层直到完成,然后将其移回大图层。为另一个 hack 付出了很多努力......
更新:使用穿孔器,我看到画布在拖动此对象时重复执行布局传递,这是缓慢的部分。想知道有什么办法可以避免这种情况...
【问题讨论】:
-
某种虚拟化会有所帮助,例如blogs.msdn.com/b/kaelr/archive/2010/08/11/… 可能并不直接适用于可移动物品。
-
@H.B.:只要移动的项目总是被绘制(不管虚拟化),它应该可以正常应用。缓慢刷新可能是画布反复布局其子级的所有,而不仅仅是那些可见的。如果只做后者,应该会有很大的性能提升。
-
我当然希望画布有一个内置的(可选的?)虚拟器来处理这种东西......我过去在尝试使用虚拟化画布时遇到了问题,但可能是时候了再试一次。啊。
-
虚拟化并不是那种轻到足以使其成为可选的东西——这就是为什么
VirtualizingStackPanel是一个完全属于它自己的类。 -
使用装饰层作为你的临时层可能是要走的路...
标签: c# wpf performance xaml