C# Unfocus实时更新图表

C# Unfocus实时更新图表,c#,charts,focus,backgroundworker,C#,Charts,Focus,Backgroundworker,我有一个由两个表单组成的项目,MainForm和CrossCorrPlotForm。在CrossCorrPlotForm上,我有两个图表(CrossCorrExpChart和CrossCorrRefChart),我使用所述代码和启用了滚轮缩放功能 一切都进行得很顺利,直到我在MainForm上添加了另一张chart(histChart),它在从相机(15-20 FPS)传入的每个帧上更新,使用BackgroundWorker从图像中收集和绘制数据。现在,我在CrossCorrPlotChart上

我有一个由两个表单组成的项目,
MainForm
CrossCorrPlotForm
。在
CrossCorrPlotForm
上,我有两个
图表
CrossCorrExpChart
CrossCorrRefChart
),我使用所述代码和启用了滚轮缩放功能

一切都进行得很顺利,直到我在
MainForm
上添加了另一张
chart
histChart
),它在从相机(15-20 FPS)传入的每个帧上更新,使用
BackgroundWorker
从图像中收集和绘制数据。现在,我在
CrossCorrPlotChart
上的两个图表不再可缩放

我认为这与实时更新图表收回每次更新的焦点有关。我尝试在代码中添加
histChart.Focus=false
,但没有效果,因为似乎“Control.Focused是只读的”

有人知道如何使我的
图表再次可缩放吗

谢谢

编辑:以下是更新图表历史的
BackgroundWorker
的代码:

    private void OnFrameReceived(Frame frame)
    {
        bgw1.RunWorkerAsync(frame);
    }

    private void bgw1_DoWork(object s, DoWorkEventArgs e)
    {
        Frame frame = (Frame)e.Argument;
        myBitmap = null;
        try
        {
            frame.Fill(ref myBitmap);
            mycamera.QueueFrame(frame);
            SaveBitmap = myBitmap.Clone(cloneRect, myBitmap.PixelFormat);
            BitmapToPrint = myBitmap.Clone(cloneRect, myBitmap.PixelFormat);
        }
        catch {}
    }

    private void bgw1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {
        if (this.InvokeRequired)
        {
            BeginInvoke((Action)(() => bgw1_RunWorkerCompleted(sender, e)));
        }
        else
        {
            new Thread(() =>
            {
                Thread.CurrentThread.IsBackground = true;
                DataFromBitmap DataFromBitmapHist = new DataFromBitmap(SaveBitmap.Clone(cloneRect, SaveBitmap.PixelFormat));
                PixelColorCount = DataFromBitmapHist.ColorCountOutput();
            }).Start();

            chartHist.Titles["Title2"].Visible = false;
            chartHist.Series["Pixel count"].Points.Clear();

            //Plotting the pixel counter, to detect saturation
            for (int i = 0; i < PixelColorCount.Length; i++)
            {
                chartHist.Series["Pixel count"].Points.AddXY(i, PixelColorCount[i]);
            }

            //If there are saturated pixels : toggle a title on chartHist to warn the user
            if (PixelColorCount.Last() > 1)
            {
                chartHist.Titles["Title1"].Visible = false;
                chartHist.Titles["Title2"].Visible = true;
            }
            else
            {
                chartHist.Titles["Title1"].Visible = true;
                chartHist.Titles["Title2"].Visible = false;
            }
        }
    }
private void OnFrameReceived(帧)
{
bgw1.RunWorkerAsync(帧);
}
私有无效bgw1_道工(对象s、道工目标e)
{
Frame=(Frame)e.参数;
myBitmap=null;
尝试
{
帧填充(参考myBitmap);
mycamera.QueueFrame(帧);
SaveBitmap=myBitmap.Clone(cloneRect,myBitmap.PixelFormat);
BitmapToPrint=myBitmap.Clone(cloneRect,myBitmap.PixelFormat);
}
捕获{}
}
私有无效bgw1_RunWorkerCompleted(对象发送方,RunWorkerCompletedEventArgs e)
{
if(this.invokererequired)
{
开始激活((操作)(()=>bgw1_运行工作已完成(发送方,e));
}
其他的
{
新线程(()=>
{
Thread.CurrentThread.IsBackground=true;
DataFromBitmap DataFromBitmapHist=新的DataFromBitmap(SaveBitmap.Clone(cloneRect,SaveBitmap.PixelFormat));
PixelColorCount=DataFromBitmapHist.ColorCountOutput();
}).Start();
图表历史标题[“标题2”]。可见=假;
chartHist.Series[“像素计数”].Points.Clear();
//绘制像素计数器,以检测饱和度
对于(int i=0;i1)
{
图表历史标题[“标题1”]。可见=假;
图表历史标题[“标题2”]。可见=真;
}
其他的
{
图表历史标题[“标题1”]。可见=真;
图表历史标题[“标题2”]。可见=假;
}
}
}
注:

  • OnFrameReceived
    是摄像头API的一个函数,它包含从摄像头接收到
    Frame
    时触发的代码
  • frame.Fill
    frame
    对象中包含的图像放入
    位图中
  • mycamera.QueueFrame
    Frame
    对象发送回相机,以接收新图像
  • 我不得不使用多个线程,因为过多地使用UI线程会阻塞摄像头的接收

我想我们希望看到更新的代码,至少是其中的重要部分。@TaW我不想用代码把问题弄得一团糟,我认为这与这里没有什么关系。我现在就添加它!我不想把问题搞得乱七八糟——好的计划:-)我不得不使用多个线程,因为使用UI线程太多会阻塞来自摄像头的接收。嗯,听起来有点可疑,好像摄像头代码也在用户界面上运行。。?这可能解释了缩放是如何被阻止的但我在这里大部分时间都在猜测。@TaW说实话,我也没有一点线索。但你可能是对的。让实时图表在几秒钟后正确运行而不崩溃是一件非常痛苦的事情。我认为我使用的API相当糟糕(但我没有太多选择),手册也没有给出任何关于
OnFrameReceived
是否在UI线程上运行的提示。我的猜测是这样的,因为我必须使用
后台工作人员
。无论如何,我认为这和我的焦点问题无关,因为它以前是有效的。是否有方法重写Control.Focus的只读属性?