使用WPF在可滚动区域中创建数千个控件的最佳方法是什么

时间:2009-06-24 16:32:03

标签: c# wpf-controls scroll high-load

我正在使用WPF和C#。

我有问题。我需要在可滚动区域中创建许多可绑定的模板化控件(它们都是不同的类型)。例如1000个文本框,1000个下拉列表和1000个复选框。

问题在于,当它们都被创建时,它的工作速度非常慢。

问题是 - 是否有可能同时拥有如此多的控制而没有滞后,我应该在哪个方向搜索解决方案?我想保存使用模板,数据绑定和简单事件处理的功能,如鼠标点击。

P.S。我尝试了很多东西(仅渲染几何体,不同的基类等等),但目前唯一对我有效的方法(我还没有尝试过)是仅创建适合当前视口的控件滚动时更新此控件列表。

P.P.S我知道在滚动期间重复使用列表项时,在ListBox中使用了一种机制,但这种方法不能在这里使用,因为所有这些项都是不同的类型。

非常感谢。

2 个答案:

答案 0 :(得分:2)

在单个屏幕上需要~3000个控件的事实是一个问题,这通常表明您从错误的角度接近GUI。我对WPF不是很有经验,但我的WinForms知识告诉我,1000多个控件实例只是在寻找麻烦。这就是ListBoxes,DataGrids和其他表格/列表格式控件的设计目的。

我在这里给出了类似问题的类似答案:Super Slow C# Custom Control

也许如果你解释你想要做什么而不是你试图实现什么解决方案,那么这里的某个人可以推动你朝着正确的方向前进。

答案 1 :(得分:1)

首先 - 我质疑设计此类要求的理由。除了网格或某种列表之外的任何东西都有成千上万的控件(它们都是常量,不变,所以列表式方法可以正常工作)对你的用户来说会让你感到非常困惑。你基本上强迫一个不明显的,不断变化的界面,上面有成千上万的项目。

有人说......

  

P.P.S我知道在滚动期间重复使用列表项时,在ListBox中使用了一种机制,但这种方法不能在这里使用,因为所有这些项都是不同的类型。

这实际上可能是你最好的方法。这应该可以正常工作 - 虽然它不会像列表框机制那么简单。您始终可以预先创建控件 - 只需根据需要创建足够的每种类型的控件来填充当前容器,并在滚动时将相应的控件重新分配到适当的位置。

如果您确实需要数千个控件,这很可能是您的最佳选择。