有时我的listBox1或我更新里面的值是闪烁秒或更少,我怎么能解决它

本文关键字:闪烁 怎么能 解决 listBox1 我的 更新 | 更新日期: 2023-09-27 18:02:55

这是我更新ListBox的代码:

this.Invoke(new Action(() => data = new List<string>()));
this.Invoke(new Action(() => data.Add("Gpu Temeprature --- " + sensor.Value.ToString())));
this.Invoke(new Action(() => listBox1.DataSource = null));
this.Invoke(new Action(() => listBox1.DataSource = data));
this.Invoke(new Action(() => listBox1.Invalidate()));

变量数据是List<string>一旦我为数据添加了一个新的,所以现在传感器的值(sensor. value)正在更新的地方,我的意思是每次删除旧值,并添加一个新的。

有时ListBox中的项目本身闪烁不到一秒钟左右,有时只有sensor.Value闪烁。

尝试为ListBox添加Validate()没有帮助。

这是后台do work事件:

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
    BackgroundWorker worker = sender as BackgroundWorker;
    while (true)
    {
        if ((worker.CancellationPending == true))
        {
            e.Cancel = true;
            break;
        }
        else
        {
            if (tempCpuValue >= (float?)nud1.Value || tempGpuValue >= (float?)nud1.Value)
            {
                soundPlay = true;
                blinking_label();
                NudgeMe();
            }
            else
            {
                soundPlay = false;
                stop_alarm = true;
            }
            cpuView();
            gpuView();
        }
    }
}

我有两个listBox的事件:

private void listBox1_MeasureItem(object sender, MeasureItemEventArgs e)
{
    e.ItemHeight = 25;
}
private void listBox1_DrawItem(object sender, DrawItemEventArgs e)
{
    if (e.Index == -1)
    {
    }
    else
    {
        ColorText.ColorListBox(data, e);
    }
}

和来自另一个类的ColorText函数,用于给listBox中的项目上色:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Drawing;
using System.Windows.Forms;
namespace GatherLinks
{
    class ColorText
    {

        public static void Texts(RichTextBox box, string text, Color color)
        {
            box.SelectionStart = box.TextLength;
            box.SelectionLength = 0;
            box.SelectionColor = color;
            box.AppendText(text);
            box.SelectionColor = box.ForeColor;
        }
        public static void ColorListBox(List<string> data, DrawItemEventArgs e)
        {
            string strLeft = null;
            string strMid = "---";
            string strRight = null;
            if (data[e.Index].Contains(strMid))
            {
                int index = data[e.Index].IndexOf(strMid);
                strLeft = data[e.Index].Substring(0, index);
                strRight = data[e.Index].Substring(index + strMid.Length);
            }
            using (Font f = new Font(FontFamily.GenericSansSerif, 20, FontStyle.Regular))
            {
                float startPos;
                e.Graphics.DrawString(strLeft, f, Brushes.Red, e.Bounds.X, e.Bounds.Y);
                startPos = e.Graphics.MeasureString(strLeft, f).Width;
                e.Graphics.DrawString(strMid, f, Brushes.Black, e.Bounds.X + startPos, e.Bounds.Y);
                startPos = e.Graphics.MeasureString(strLeft + strMid, f).Width;
                e.Graphics.DrawString(strRight, f, Brushes.Green, e.Bounds.X + startPos, e.Bounds.Y);
            }
        }
    }
}

我怎样才能使ListBox使它不会每隔几秒钟或每次新的传感器闪烁。Value Value是否更新?我不确定为什么和何时发生,但ListBox项目和传感器。

有时我的listBox1或我更新里面的值是闪烁秒或更少,我怎么能解决它

我认为问题来自于您正在清除DataSource然后再次设置它的事实。没有必要将数据源设置为null,然后在数据更改时重置它。

尝试删除这两行,看看闪烁是否消失:

this.Invoke(new Action(() => listBox1.DataSource = null));
this.Invoke(new Action(() => listBox1.DataSource = data));

您对Invoke方法的使用是错误的,这可能是闪烁的原因。

试着像这样改变你的代码的第一部分:

this.Invoke(new Action(() =>
    {
        data = new List<string>();
        data.Add("Gpu Temeprature --- " + sensor.Value.ToString());
        listBox1.DataSource = null;
        listBox1.DataSource = data;
        listBox1.Invalidate()
    }));

每次调用Invoke方法时,一条消息被发送到应用程序的消息队列,然后在UI不忙时在UI线程中处理。通过多次调用Invoke,您将发送多条消息,这些消息将分别处理。

一旦我解决了把这个放在我的表单上:

protected override CreateParams CreateParams
{
    get
    {
        CreateParams cp = base.CreateParams;
        cp.ExStyle |= 0x02000000;  // Turn on WS_EX_COMPOSITED
        return cp;
    }
}