ListView - 如何避免闪烁(.NET/C#)?

Posted

技术标签:

【中文标题】ListView - 如何避免闪烁(.NET/C#)?【英文标题】:ListView - how to avoid twinkling (.NET/C#)? 【发布时间】:2010-10-30 08:59:04 【问题描述】:

我的应用程序是多线程的,它有 f.ex 25 个活动线程,每个线程将其状态推送到委托列表视图项。

示例:

    private delegate void SetBackColorDelegate(int index, Color color);
    private void SetBackColor(int index, Color color)
    
        if (listView1.InvokeRequired)
        
              listView1.Invoke(new SetBackColorDelegate(SetBackColor), new object[]  index, color );

        
        else
        
              listView1.Items[index].BackColor = color;
        
    

根据状态,它会改变项目颜色等。它会闪烁很多,看起来很讨厌:)

也许您可以建议如何避免这种情况?如何加快绘图速度?或者也许我应该考虑开始使用一些不同的组件?

【问题讨论】:

我想你的意思是闪烁。 你能稍微扩展一下这个问题吗?你有很多线程在改变项目的颜色,问题是颜色变化很大?你的意思是它闪烁,就像一个双缓冲问题,还是你的颜色变化表现得不够快,它总是落后,总是在试图跟上变化时改变颜色?我不明白为什么代码请求更改项目的颜色,然后颜色发生变化是一个问题。 【参考方案1】:

在等待您对我的评论作出回应的同时。如果闪烁的双缓冲问题,那么来自this question 的接受答案将使您顺利上路。将您的列表视图设置为使用答案中的样式,您就可以开始了。这样做会降低性能,因为它将确保颜色更新仅与显示器的刷新率同步发生(通常约为每秒 60 次),但它将停止在显示器刷新之间发生更新时发生的闪烁/撕裂.

【讨论】:

谢谢 :) 实际上这 ***.com/questions/76993/… 帮助了我 :)【参考方案2】:

考虑让每个线程将其状态推送到某个共享数据结构,然后使用计时器从 UI 线程每秒轮询一次。那样:

您不必担心从非 UI 线程调用 您不会看到“忙碌”的用户界面 您仍然可以保持最新(相对于说“如果我最近已经更新,请不要更新)的方法

我对 UI 计时器的效率了解不多 - 这样的计时器可能会相对昂贵,因此您可能无论如何都需要进行一些跨线程通信:让每个如果计时器尚未启用,非 UI 线程将启用它,并在您进行更新时将其禁用。这样一来,您将始终落后于现实一秒,但仍然每秒只有一次状态更新。

【讨论】:

是的,很容易做到。但我需要即时状态;)这就是问题所在,我可以每一秒都这样做,但我做不到。 那么听起来你有矛盾的要求:如果你需要立即更新一些东西,并且你有很多更新要显示,那么屏幕会显示所有这些更新,给出一个闪烁效果。 (如果这真的只是双缓冲,那么我误解了这个问题 - 哎呀。)

以上是关于ListView - 如何避免闪烁(.NET/C#)?的主要内容,如果未能解决你的问题,请参考以下文章

Android:ListView 闪烁效果。关于如何摆脱这个的任何提示?

单击时如何使 TextView 闪烁其背景?

notifyDataSetChanged 后如何避免闪烁效果

C#使用ListView更新数据出现闪烁解决办法

如何在经常更改面板中的控件时避免闪烁?

Bootstrap-select 插件:如何避免闪烁