1

我正在使用 WPF 和 C#。

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

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

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

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

PPS 我知道 3.5 SP1 中有一种机制在 ListBox 中使用,当列表项在滚动期间被重用但这种方法不能在这里使用,因为所有这些项目都是不同的类型。

非常感谢。

4

2 回答 2

2

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

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

也许如果你解释你想做什么而不是你想在这里实施什么解决方案,那么某人可以把你推向正确的方向。

于 2009-06-24T16:40:46.107 回答
1

首先 - 我会质疑设计此类要求的基本原理。除了网格或某种列表(它们都是恒定的,不会改变的,因此列表样式的方法可以正常工作)之外,在任何东西中都有数千个控件,这会让您的用户感到难以置信的困惑。你基本上是在强迫一个不明显的、不断变化的界面,里面有成千上万的项目。

话虽如此...

PPS 我知道 3.5 SP1 中有一种机制在 ListBox 中使用,当列表项在滚动期间被重用但这种方法不能在这里使用,因为所有这些项目都是不同的类型。

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

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

于 2009-06-24T16:39:57.417 回答