博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
WPF之VirtualizingStackPanel.IsVirtualizing="False"
阅读量:6375 次
发布时间:2019-06-23

本文共 2973 字,大约阅读时间需要 9 分钟。

原文:

相信从winform转到wpf的人都遇到过这样的困惑,在处理DataGrid时,我想让某一单元格根据格式校验的不同情况显示不同的颜色,以便于用户区分。

于是你去查找各种资料,wpf下DataGrid如何改变某一单元格颜色,如果运气不好,可能搜索到的结果会令你失望,运气不错的话你会搜到类似如下代码:

private void changeCell()         {            this.sj_DataGrid.Dispatcher.Invoke(            new Action(                delegate                {                    foreach (LSErr l in lse)                    {                        for (int i = 0; i < this.sj_DataGrid.Items.Count; i++)                        {                            DataRowView drv = this.sj_DataGrid.Items[i] as DataRowView;                            DataGridRow row = (DataGridRow)this.sj_DataGrid.ItemContainerGenerator.ContainerFromIndex(i);                            if (drv["StockCode"].ToString()==l.stCode)                            {                                System.Windows.Controls.Primitives.DataGridCellsPresenter presenter = GetVisualChild
(row); if (presenter != null) { DataGridCell cell = (DataGridCell)presenter.ItemContainerGenerator.ContainerFromIndex(l.ci); cell.Background = new SolidColorBrush(Colors.CadetBlue); } break; } } } } ) ); }//获取单元格 public static T GetVisualChild
(Visual parent) where T : Visual { T childContent = default(T); if (parent != null) { int numVisuals = VisualTreeHelper.GetChildrenCount(parent); for (int i = 0; i < numVisuals; i++) { Visual v = (Visual)VisualTreeHelper.GetChild(parent, i); childContent = v as T; if (childContent == null) { childContent = GetVisualChild
(v); } if (childContent != null) { break; } } //Thread.Sleep(10); } return childContent; }

看起来很不错,而且运行也能成功。

不过很快你就会发现问题,那就是当你的窗口大小变化时,或者你拖动滚动条的时候奇葩的事情发生了,你选择变色的单元格变掉了,变色的可能是任何一个单元格,反正不是你想要的那一个。

于是你又再一次踏上了搜索之旅

终于让你找到了一个解决办法,就是我们标题中的VirtualizingStackPanel.IsVirtualizing="False",不错,效果很好,DataGrid应用这一属性之后我们可以准确的改变单元格颜色了。

但是,问题又来了...

当你的DataGrid加载的数据稍微多一些时,比如2000,3000,...10000...,再次运行你的程序你会发现主界面竟然卡住了好几秒,于是你设置断点查看,运行时间。你会发现由于ui虚拟化被禁用,数据加载的时间被无限拖长。用户界面卡顿,造成短时间内无响应,给用户死机的感受(PS:实际上此时程序正在玩儿命的绘制UI)

这种情况下,纵使你数据校验再好,数据校验整个过程中程序卡死的假象蒙蔽下,用户也会失去耐心,除非你的项目经理很强势,让用户耐心等待...

So,换一种实现策略吧

最终,还是暂时使用模板类中的触发器来实现吧,当不同的属性下生成不同的颜色

这只是一种过度方案,当发现某单元格值达到某种条件时改变背景色,不够灵活,真正的解决这一问题还得研究wpf的ui visualization实现上下手

希望已经碰到这种问题的兄弟少走点儿弯路,或者如果有大神已经解决这种问题还请指教

转载地址:http://ysnqa.baihongyu.com/

你可能感兴趣的文章
【VMCloud云平台】SCVMM准备(一)
查看>>
RHEL6.3实现基于加密的用户认证验证访问
查看>>
SCCM2012 R2实战系列之十一:解决OSD分发Windows7 系统盘盘符为’D’问题
查看>>
Nginx实战进阶篇一 Nginx反向代理及负载均衡实现过程部署
查看>>
经验分享:我是如何在网店无货源情况下快速出单?
查看>>
为何某些文章的阅读量这么高?
查看>>
当AD服务器置于防火墙内时,所需开放的端口
查看>>
限免的Mac App套件,工程师绝对不可错过
查看>>
Exchange 2013 添加地址列表到脱机通讯簿
查看>>
Skype for Business Server 2015-05-监控和存档服务器-配置
查看>>
浅谈物化视图
查看>>
安装SQL Server 2017
查看>>
超融合超越企业传统存储绕不开的六个问题
查看>>
医院CIO的一幅工作对联
查看>>
iOS客户端的APNS服务简介与实现
查看>>
DPM灾难切换应用场景
查看>>
简单配置Oracle10g DataGuard物理备库
查看>>
网曝支付宝漏洞:手机丢了,支付宝也就完了
查看>>
4 在vCenter Server安装View Composer组件
查看>>
SFB 项目经验-24-为持久聊天室-查询或者增加成员
查看>>