如何在WPF后台代码中暂停UI刷新?
优化WPF DataGrid批量列可见性修改的性能
针对你150+列DataGrid批量修改可见性卡顿的问题,核心原因确实是每次设置column.Visibility都会触发一次UI布局重绘,累积下来导致性能下降。以下是几种有效的优化方案:
1. 使用BeginInit/EndInit暂停控件更新
WPF控件的BeginInit()和EndInit()方法会暂停控件的初始化逻辑,在这两个方法之间修改列属性,只会在EndInit()后触发一次完整的布局更新,效果类似VBA的ScreenUpdating=False:
public void OnEventHandler(AdjustColumnRequested e) { var headers = new HashSet<string>(e.Headers); // 转成HashSet优化查找速度 dataGrid.BeginInit(); // 暂停DataGrid的UI更新 foreach (var column in dataGrid.Columns) { var header = DataGridHelpers.GetHeader(column); if (header == null) continue; column.Visibility = headers.Contains(header) ? Visibility.Visible : Visibility.Collapsed; } dataGrid.EndInit(); // 恢复UI更新,触发一次完整布局 }
2. 优化查找效率
把e.Headers转成HashSet<string>,将Contains方法的时间复杂度从O(n)降到O(1),能减少循环内的耗时,尤其在列数量较多时效果更明显。
3. 可选:简化GetHeader方法
用C#模式匹配简化代码,同时避免不必要的类型转换操作:
public static string GetHeader(DataGridColumn column) { return column is DataGridTemplateColumn dgtc ? dgtc.Header as string : null; }
额外提示
如果你的DataGrid启用了列虚拟化(EnableColumnVirtualization="True"),BeginInit/EndInit也能保证批量修改后列显示正常,不会出现虚拟化相关的异常。
内容的提问来源于stack exchange,提问作者Ludovic Wagner
相关产品推荐
相关产品推荐

