首页 > 解决方案 > 从 Timer 调用 Paint 事件处理程序以更新表单控件

问题描述

我正在尝试为需要 3 个参数的计时器事件创建一个方法。我看过类似的问题并尝试实施所示的解决方案,但该解决方案在我的情况下不起作用

        GraphDrawingTimer.Elapsed += new ElapsedEventHandler(GraphPainter);
        GraphDrawingTimer.Interval = 350;
        GraphDrawingTimer.Enabled = true; 

上面是定时器初始化

        static void GraphPainter(object sender, ElapsedEventArgs e)
        {   
          //Show_Graph(c);
        }

那是一旦定时器触发就会被调用的方法。

我想添加一个PaintEventArgs c额外参数来绘制图形。我正在使用

private void tabPage2_Paint(object sender, PaintEventArgs e)

方法,但按钮不会在我的标签页上刷新,这就是为什么我要创建自己的图形绘制方法,该方法将每 350 毫秒刷新一次。我努力了

        GraphDrawingTimer.Elapsed += (object sender, ElapsedEventArgs e) => { GraphPainter(sender, e, c); };
        GraphDrawingTimer.Interval = 350;
        GraphDrawingTimer.Enabled = true;

......

        static void GraphPainter(object sender, ElapsedEventArgs e, PaintEventArgs c)
        {   
          Show_Graph(c);
        }

但这不起作用。我收到错误“当前上下文中不存在名称'c'”。我也试过

        PaintEventArgs c; 

        GraphDrawingTimer.Elapsed += (object sender, ElapsedEventArgs e)=> { GraphPainter(sender, e,  c); };
        GraphDrawingTimer.Interval = 350;
        GraphDrawingTimer.Enabled = true;

......

        static void GraphPainter(object sender, ElapsedEventArgs e, PaintEventArgs c)
        {   
          Show_Graph(c);
        }

我收到以下错误

错误 CS0165 使用未分配的局部变量“c”

这确实是有道理的,因为我没有为它分配任何值 - 那么如何为其分配一个值以PaintEventArgs c传递 Paint 事件的正确参数?或者也许应该有其他方法来调用 Paint 事件?

标签: c#

解决方案


PaintEventArgs 这样可能无效。最好的选择是在要从计时器更新的控件上使用 .Invalidate() 方法,这将导致调用它们的绘制事件。

https://docs.microsoft.com/en-us/dotnet/api/system.windows.forms.control.invalidate?view=net-5.0

这可能看起来像:

   GraphDrawingTimer.Elapsed +=
         (object sender, ElapsedEventArgs e) => MyGraphControl.Invalidate();

推荐阅读