使用计时器向表单添加控件
Adding controls to form using timers
所以我正在尝试向表单添加控件,并且我正在使用一种解决方法,以便我可以通过静态函数添加控件,我是这样做的:
Control c = this;
Button b = new Button();
//....
c.Controls.Add(b);
这个可行,所以我一直用这个方法添加控件。但是现在我正在使用定时器,但它不起作用
Control c = this;
Timer t = new Timer(500);
t.Elapsed += new ElapsedEventHandler(t_Elapsed);
public static void t_Elapsed(object sender, ElapsedEventArgs e)
{
Button b = new Button();
//...
c.Controls.Add(b);
}
函数t_Elapsed
是运行,那里的代码正在执行,但是c.Controls.Add(b)
行没有执行。
您的代码存在一些问题:
为什么要使用静态事件处理程序,然后使用变通方法访问实例变量,而您本来可以首先使用非静态事件处理程序?
您使用的计时器 class 是 System.Timers.Timer
,还有几个不同的计时器 class,它们的行为略有不同。可以找到比较 here。
当您以任何方式修改 UI 时,您必须从 UI 线程进行修改。 System.Timers.Timer
可以 调用 UI 线程上的事件处理程序,但前提是您提供同步对象,该对象是实现 ISynchronizeInvoke
的任何对象接口,例如Form
.
您可以使用 t.SynchronizingObject = this
设置同步对象,如果 this
引用 Form
class.
的实例
您必须在创建它们的线程上访问控件。
您的计时器已用事件在与 UI 不同的线程上触发,因此您需要将调用编组到 UI 线程。
这可以用Invoke
来完成:
void t_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
this.BeginInvoke((Action)delegate
{
Button b = new Button();
c.Controls.Add(b);
});
}
所以我正在尝试向表单添加控件,并且我正在使用一种解决方法,以便我可以通过静态函数添加控件,我是这样做的:
Control c = this;
Button b = new Button();
//....
c.Controls.Add(b);
这个可行,所以我一直用这个方法添加控件。但是现在我正在使用定时器,但它不起作用
Control c = this;
Timer t = new Timer(500);
t.Elapsed += new ElapsedEventHandler(t_Elapsed);
public static void t_Elapsed(object sender, ElapsedEventArgs e)
{
Button b = new Button();
//...
c.Controls.Add(b);
}
函数t_Elapsed
是运行,那里的代码正在执行,但是c.Controls.Add(b)
行没有执行。
您的代码存在一些问题:
为什么要使用静态事件处理程序,然后使用变通方法访问实例变量,而您本来可以首先使用非静态事件处理程序?
您使用的计时器 class 是
System.Timers.Timer
,还有几个不同的计时器 class,它们的行为略有不同。可以找到比较 here。
当您以任何方式修改 UI 时,您必须从 UI 线程进行修改。 System.Timers.Timer
可以 调用 UI 线程上的事件处理程序,但前提是您提供同步对象,该对象是实现 ISynchronizeInvoke
的任何对象接口,例如Form
.
您可以使用 t.SynchronizingObject = this
设置同步对象,如果 this
引用 Form
class.
您必须在创建它们的线程上访问控件。
您的计时器已用事件在与 UI 不同的线程上触发,因此您需要将调用编组到 UI 线程。
这可以用Invoke
来完成:
void t_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
this.BeginInvoke((Action)delegate
{
Button b = new Button();
c.Controls.Add(b);
});
}