我正在使用WPF和C#。
我有问题。我需要在可滚动区域中创建许多可绑定的模板化控件(它们都是不同的类型)。例如1000个文本框,1000个下拉列表和1000个复选框。
问题在于,当它们都被创建时,它的工作速度非常慢。
问题是 - 是否有可能同时拥有如此多的控制而没有滞后,我应该在哪个方向搜索解决方案?我想保存使用模板,数据绑定和简单事件处理的功能,如鼠标点击。
P.S。我尝试了很多东西(仅渲染几何体,不同的基类等等),但目前唯一对我有效的方法(我还没有尝试过)是仅创建适合当前视口的控件滚动时更新此控件列表。
P.P.S我知道在滚动期间重复使用列表项时,在ListBox中使用了一种机制,但这种方法不能在这里使用,因为所有这些项都是不同的类型。
非常感谢。
答案 0 :(得分:2)
在单个屏幕上需要~3000个控件的事实是一个问题,这通常表明您从错误的角度接近GUI。我对WPF不是很有经验,但我的WinForms知识告诉我,1000多个控件实例只是在寻找麻烦。这就是ListBoxes,DataGrids和其他表格/列表格式控件的设计目的。
我在这里给出了类似问题的类似答案:Super Slow C# Custom Control
也许如果你解释你想要做什么而不是你试图实现什么解决方案,那么这里的某个人可以推动你朝着正确的方向前进。
答案 1 :(得分:1)
首先 - 我质疑设计此类要求的理由。除了网格或某种列表之外的任何东西都有成千上万的控件(它们都是常量,不变,所以列表式方法可以正常工作)对你的用户来说会让你感到非常困惑。你基本上强迫一个不明显的,不断变化的界面,上面有成千上万的项目。
有人说......
P.P.S我知道在滚动期间重复使用列表项时,在ListBox中使用了一种机制,但这种方法不能在这里使用,因为所有这些项都是不同的类型。
这实际上可能是你最好的方法。这应该可以正常工作 - 虽然它不会像列表框机制那么简单。您始终可以预先创建控件 - 只需根据需要创建足够的每种类型的控件来填充当前容器,并在滚动时将相应的控件重新分配到适当的位置。
如果您确实需要数千个控件,这很可能是您的最佳选择。