【问题标题】:WPF UI Freezes when Populating DataGrid填充 DataGrid 时 WPF UI 冻结
【发布时间】:2016-12-22 14:58:54
【问题描述】:

我有一个 WPF 项目,其 DataGrid 绑定到可观察集合。 此集合使用异步方法填充,当我调用此异步方法时,会向用户显示带有进度环的动画。

当集合在等待数据时,一切工作都没有延迟,但是当 DataGrid 用项目填充自身时,进度环动画停止工作 1 秒或 2 秒,直到 DataGrid 加载所有记录(这集合可能有 50,000 条或更多记录)。我只是想知道当DataGrid 使用从集合返回的信息填充自身时是否有办法不锁定动画。

设置如下: 我有一个带有隐藏用户控件的主窗口,该控件使用名为 IsLoading 的属性显示/隐藏动画。当此用户控件可见时,它会锁定其后面的所有用户对象。

代码是

<Grid>
 <local:LoadingOverlayView 
        DataContext="{Binding Assets}"
        d:IsHidden ="True"
        Visibility="{Binding IsLoading, 
        Converter={StaticResource BoolToVisibilityConverter},
                UpdateSourceTrigger=PropertyChanged}"/>
</Grid>

【问题讨论】:

标签: c# wpf wpf-controls wpfdatagrid


【解决方案1】:

实现动画进度环、进度条等的最佳方式是为它们使用辅助线程。稍后将其他线程与 ui 线程同步使用 Dispatcher.Invoke() 方法。

【讨论】:

  • Dispatcher.Invoke() 是一种用于告诉 Dispatcher 在与 Dispatcher 关联的线程上同步执行某事(如委托)的方法。它不用于“将其他线程与ui线程同步”。
【解决方案2】:

这意味着数据网格的虚拟化已关闭。它正在为所有行创建所有 UI 元素。这可能有不同的原因。很可能是因为您将数据网格放在滚动面板中。通过这样做,它不知道它的高度,也无法确定它必须为其创建 UI 元素的最小行集。

这很好读:https://msdn.microsoft.com/en-us/library/cc716879(v=vs.110).aspx 但它可能变得相当复杂

【讨论】:

  • 行和列的虚拟化当然会有所帮助,但它也有其自身的局限性。我建议将虚拟化与后台线程一起使用,以免阻塞 UI 线程,尤其是在要显示多行的情况下。
  • 我真的很怀疑;问题明确指出:“虽然集合正在等待数据,但一切工作都没有延迟,但是当 DataGrid 用项目填充自身时,进度环动画停止工作 1 秒或 2 秒,直到 DataGrid 加载所有记录(此集合可能有 50,000 条或更多条记录)。”因此立即加载并且进程环动画停止;表示他没有延迟构建集合,但此时数据网格将完成其工作。
  • 确切地说,当 DataGrid 填充自身时,进度环的动画会阻塞一小段时间......这没什么大不了的,但如果我能继续看到会更好在 DataGrid 加载数据时,没有“窒息”的环形动画......我也不确定如何在 2 个不同的线程中隔离它,因为这些是 2 个不同的 WPF 用户控件,它们绑定到一个常见的 True/False 属性,显示或隐藏Datagrid 加载完成后的动画......
  • 在 DataGRid 我有 EnableColumnVirtualization="True" EnableRowVirtualization="True"
  • 通过使用 xaml 实时可视化树,您可以查看创建了多少行。这个节目是少数。很难理解为什么虚拟化不起作用。涉及的因素太多了。最好阅读我提供的博客
猜你喜欢
  • 2021-04-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-16
  • 1970-01-01
  • 1970-01-01
  • 2011-09-24
  • 1970-01-01
相关资源
最近更新 更多