有时我的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
项目和传感器。
我认为问题来自于您正在清除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;
}
}