【问题标题】:How to reduce TreeView population time on UI thread?如何减少 UI 线程上的 TreeView 填充时间?
【发布时间】:2023-03-24 04:06:01
【问题描述】:

我正在制作一个媒体统计应用程序,它有一个TreeView 控件,其中所有媒体文件都作为项目。填充它需要几秒钟,我认为必须有另一种方法来在任何滚动条位置显示项目而不会花费太多时间。

禁止从创建它们的线程(UI 线程)以外的线程访问控件,因此它要么是具有明显冻结的常用方法,要么是我想不出的其他方式。

如何使用许多项目填充 TreeView 控件而不会使 UI 线程长时间停滞?

【问题讨论】:

  • 如果真的有那么个项目,你确定要将它们都放在一个ListBox吗?足够多会导致渲染问题往往与足够多会导致糟糕的用户体验相吻合。
  • 虽然没有渲染问题。填充只需大约 30 秒,然后一切顺利且无泪。
  • 重点是,作为用户,尝试搜索 项通常很麻烦。通常值得寻找一种过滤列表的方法,可能通过某种形式的级联字段(选择一个可以过滤此处显示的内容的类别)或通过某种形式的分页。并不是您必须这样做,只是这可能比尝试在列表框中找到第 7,346 个项目更好。
  • 实际上,更好的主意是使用 ListView 或其他允许树视图的东西,但该控件需要更多时间来填充。在这种情况下,我真的应该询问 ListView,但我仍然不确定这是否是要使用的控件。
  • 假设您一次加载所有内容。不要那样做。仅加载他们可以看到的内容,然后在每个项目展开时,动态填充下一个级别。当 那个 级别被扩展时,向下扩展一个级别,等等。实际上代码有点复杂,但它创造了更好的用户体验。在不冻结 UI 的情况下填充列表框当然是可能的,而且实际上相当容易,但我只是想确定你真的想要这样做。

标签: c# winforms treeview


【解决方案1】:

不要一次加载所有项目。只加载他们在任何给定时间点需要看到的内容(所以首先,只有顶层),然后当任何给定项目展开时(有一个相关事件供您添加处理程序),动态填充下一级。当下一层的项目展开时,向下展开一层,等等。

【讨论】:

    【解决方案2】:

    从另一个优先级较低的线程中使用您的 UI 线程的 Dispatcher。

    或者你可以用不同的方式实现它。显示链接到仍在后台加载的项目的 VM,并在项目完成加载时更新 VM。

    或者一次只加载 X 数量,页面项目。

    【讨论】:

    • 然后您会在很长一段时间内冻结 UI 线程。而且,他显然已经知道该怎么做。又不是在问如何处理跨线程异常。
    猜你喜欢
    • 1970-01-01
    • 2021-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-12
    • 2018-04-24
    • 1970-01-01
    相关资源
    最近更新 更多