【问题标题】:C# trackbar not updatingC# 轨迹栏不更新
【发布时间】:2017-08-08 16:15:04
【问题描述】:

我最近遇到了这个非常棘手的问题,希望有人能帮助我。

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

当我尝试以任何方法修改跟踪器的值(以编程方式)(移动滑块)时,它与以下代码完美配合:

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 滑块不移动

附加信息:我尝试运行程序,然后使用可视化工作室暂停它,并且轨迹栏已成功更改,唯一不起作用的是图形方面。

我已经测试了多个轨迹栏,并尝试使用

trackbar1.Refresh();

没用

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

trackbars not moving

【问题讨论】:

    标签: c# trackbar


    【解决方案1】:

    SerialPort 的 DataReceived 事件在您无法更改 UI 元素的辅助线程(不是 UI 线程)上引发。 使用“调用”,您可以在 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));
    }
    

    【讨论】:

    • 对我不起作用,我收到错误“在创建窗口句柄之前无法在控件上调用调用或 begininvoke”。我在网上查看过,但找不到与问题完全匹配的示例。我会继续寻找答案。
    • 似乎 DataReceived 事件是在添加处理程序后不久触发的,并且在窗口和轨迹栏本身被正确实例化并为它们创建句柄之前。您可以在调用他更改之前检查这一点(答案中的代码已更新...)
    • 此外,当您的应用程序关闭窗口而串行端口不断引发 DataReceived 事件时,可能会出现该错误消息。因此,请务必在关闭窗口之前删除事件处理程序(在表单的 onClosing 事件中?)。
    • 实际上越来越混乱了 XD。我已经尝试过您的编辑,但现在什么也没有发生......所以我想这意味着 Trackbar2.isHandleCreated 总是假的?
    • 是的,好像是这样。您可以在事件处理程序的开头设置断点并检查 trackbar2 (它的句柄)。在什么时候将处理程序添加到 Serialport.Datareceived 事件?这应该在表单中的“InitializeComponent()”调用之后。
    【解决方案2】:

    我发现了问题,当我声明我的串行通信时我正在使用`

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

    而我应该只使用

           initialiseSerialEventHandler(arduinoCOM);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-05-24
      • 1970-01-01
      • 2019-08-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-05
      相关资源
      最近更新 更多