【问题标题】:What's the best way of creation of thousands of controls in scrollable area using WPF使用 WPF 在可滚动区域中创建数千个控件的最佳方法是什么
【发布时间】:2009-06-24 16:32:03
【问题描述】:

我正在使用 WPF 和 C#。

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

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

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

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

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

非常感谢。

【问题讨论】:

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


    【解决方案1】:

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

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

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

    【讨论】:

    • 实际上我需要创建某种动态更新的模式。根据其内部状态,许多具有不同动画和/或可视化的项目。想象一下,例如带有变压器发电机等的发电厂的演示文稿,其中包含许多要显示和/或编辑的参数。
    【解决方案2】:

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

    话说回来……

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

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

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

    【讨论】:

    • 我被告知并亲眼目睹了具有大量数据绑定的较少控件的性能优于其他方式。 FrameworkUIElement 的成本非常
    • @sixlettervariables:这就是我在这里所说的 - 最好拥有较少数量的总控件,并在滚动时重新分配(重用)数据绑定,就像列表框一样。他只需要在滚动期间额外重新定位/布局。
    • 问题在于该控件的类型很多。我提到了文本框和其他一些原语,只是为了更容易理解问题。实际上会有包含几个文本框、图形基元、动画等的控件。如果我要使用可重用的方法,我想我需要创建一些基本的控件类型。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多