C#trackbar没有更新

时间:2017-08-08 16:15:04

标签: c# trackbar

我最近遇到了这个相当棘手的问题,我希望有人可以帮助我。

我有一个程序,它使用轨迹栏来显示音量,并通过串口控制Arduino。

当我尝试在任何方法中修改trackar(移动滑块)的值(programmaticaly)时,它与以下代码完美配合:

trackbar1.Value = ...;

然而,当我把它放在我的串行数据处理程序中时,它不起作用:/

我以这种方式声明串行数据处理程序:

//declaring arduinoCom
public SerialPort arduinoCOM;

//In form1
arduinoCOM.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler);

我的处理程序如下所示:

public void DataReceivedHandler(
                        object sender,
                        SerialDataReceivedEventArgs e)
    {
        trackBar2.Value = 50;

    }

串行通信工作完美无缺,处理程序的工作没有问题。

我已经尝试了2天了,我能够确定工作轨道栏和不工作轨道栏之间的唯一区别是" trackbar1.value"位于。因此,出于清晰的原因,我删除了其余的(我希望)非遗漏代码。

所以我的问题是当我尝试在"标准方法之外修改它的价值时,为什么Trackbar滑块不会移动"

其他信息:我尝试过运行该程序,然后将其与视觉stuio和trackbar暂停.Value已成功更改,唯一不起作用的是图形端。

我已经使用多个轨道栏进行了测试,并尝试使用

trackbar1.Refresh();

它没有工作

轨迹栏1和2的值的图片以及所有5的图片: Values of trackbars

trackbars not moving

2 个答案:

答案 0 :(得分:5)

SerialPort的DataReceived事件是在一个不能更改UI元素的secundary线程(不是UI线程)上引发的。 使用' Invoke',您可以在UI线程中进行更改 而不是

public void DataReceivedHandler(
                    object sender,
                    SerialDataReceivedEventArgs e)
{
    trackBar2.Value = 50;

}

使用:

public void DataReceivedHandler(
                    object sender,
                    SerialDataReceivedEventArgs e)
{
    if (trackbBar2.IsHandlecreated) trackBar2.Invoke(new Action(() =>  trackbar.Value = 50));
}

答案 1 :(得分:1)

我发现了问题,当我宣布我的串口通信时,我正在使用`

   Form1 form1 = new Mixer.Form1();
   initialiseSerialEventHandler(arduinoCOM);

而我应该只使用

       initialiseSerialEventHandler(arduinoCOM);