2

这是我正在更新的代码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闪烁。

试图添加一个Validate()没有ListBox帮助。

这是后台做工作事件:

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不会每隔几秒钟或每次更新新的sensor.Value值时闪烁?我不确定为什么以及何时发生,但ListBox项目和传感器。值正在闪烁。

4

3 回答 3

0

我认为问题出在您正在清除DataSource然后再次设置它的事实。不必将数据源设置为null然后在数据更改时将其重置。

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

this.Invoke(new Action(() => listBox1.DataSource = null));
this.Invoke(new Action(() => listBox1.DataSource = data));
于 2013-03-07T21:26:07.890 回答
0

您对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通过多次调用,您将发送多条消息,这些消息将分别处理。

于 2013-03-07T21:26:45.700 回答
0

一旦我解决了把它放在我的表格上:

protected override CreateParams CreateParams
{
    get
    {
        CreateParams cp = base.CreateParams;
        cp.ExStyle |= 0x02000000;  // Turn on WS_EX_COMPOSITED
        return cp;
    }
}
于 2013-03-07T21:42:59.953 回答