首页 > 解决方案 > 有没有办法在循环中更新 Windows 窗体?

问题描述

我的目标是做一个桌面宠物。我已经编写了很多在while循环中执行并更新每次迭代的逻辑。为了显示我正在寻找的生物,我使用 Windows 窗体,但这带来了一个两难境地。

我希望能够执行逻辑,然后在同一个循环中更新窗口(处理事件和重绘),而无需处理Application.Run()或多线程。作为一个例子,作为一个来自 python 的人,使用 tkinter 可以update()在循环中调用窗口上的方法,这与调用一次基本相同mainloop(),只是它不会阻塞程序。

表单是否提供任何类似的功能?

标签: c#winforms

解决方案


正如 Scott Chamberlain 所提到的,您应该使用计时器来运行您的“循环”。Winforms 是基于事件的,因此添加无限循环将冻结程序,因为事件被阻止。

此代码说明了如何使用计时器。我在表单中添加了一个图片框,它在计时器触发时在屏幕上移动。

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();

        Timer tmr = new Timer();
        tmr.Interval = 50;   // milliseconds
        tmr.Tick += Tmr_Tick;  // set handler
        tmr.Start();
    }

    private void Tmr_Tick(object sender, EventArgs e)  //run this logic each timer tick
    {
        pictureBox1.Left += 1;  // move image across screen, picture box is control so no repaint needed
    }
}

推荐阅读