我目前正在开发一个在带有MS Compact Framework 2.0的Windows CE 5设备上运行的C#应用程序。 在这个应用程序中,我通过BeginInvoke异步调用键盘钩子中的单例对话框:
this.BeginInvoke((ThreadStart)delegate()
{
DlgX.getInstance().display(TaskController.getInstance().getActiveTask().getValues(), true);
});
在对话框的显示方法中,我想将焦点设置为某个控件。由于Win CE设备非常慢,我必须使用计时器来延迟Focus()执行:
System.Windows.Forms.Timer timer = new System.Windows.Forms.Timer();
timer.Interval = 600;
timer.Enabled = true;
timer.Tick += (EventHandler)delegate(object obj, EventArgs args)
{
button1.Focus();
timer.Dispose();
};
不幸的是,这不起作用。关闭对话框后,计时器立即执行。 我做错了什么?
提前感谢您的帮助!
编辑: 这是对话框的整个display()方法:
public void display(List<InputRow> fvList, bool validate)
{
this.fvList = fvList;
ctlCount = (fvList.Count > 5 ? 5 : fvList.Count);
for (int i = 0; i < ctlCount; i++)
{
//some 100% irrelevant stuff
}
button1.KeyDown += new KeyEventHandler(btnOK_KeyDown);
button1.Click += new EventHandler(btnOK_Click);
if (!this.Visible)
{
ShowDialog();
}
if (validate)
{
System.Windows.Forms.Timer timer = new System.Windows.Forms.Timer();
timer.Interval = 600;
timer.Enabled = true;
timer.Tick += (EventHandler)delegate(object obj, EventArgs args)
{
button1.Focus();
timer.Dispose();
};
}
}
答案 0 :(得分:3)
关闭表单时会评估计时器实例化和启用,因为ShowDialog
是同步。你应该把你的计时器放在ShowDialog