为什么这个Visual Studio计时器组件在设计时工作?

本文关键字:工作 组件 Visual Studio 计时器 为什么 | 更新日期: 2023-09-27 18:08:10

在。net windows窗体应用程序中,有一个在窗体中启用的定时器。以下代码是句柄:

    private void timer2_Tick(object sender, EventArgs e)
    {
        try
        {
            if ( !CheckLock())
            {
                MessageBox.Show("No lock found.");
                this.Close();
            }
        }
        catch (Exception ex)
        {
            MessageBox.Show("No lock found.");
            this.Close();
        }
    }

该锁为usb硬件锁。令人惊讶的是,代码显示这个弹出消息在设计时间(在VS 2010 IDE),如果我拿出锁。

有谁知道原因是什么吗?

为什么这个Visual Studio计时器组件在设计时工作?

这很正常,您的代码也可以在设计时运行。这个方法的上下文不清楚,但是很有可能在继承这个方法所在的Form类时让计时器滴答作响。或者当你在UserControl中有这段代码时,你把它放到窗体上。

这是设计器提供所见即所得外观的主要方式。比如设置控件的BackgroundImage属性,也会立即在设计器中显示图像。换句话说,BackgroundImage属性setter和控件的OnPaintBackground()方法都在设计时执行。基本规则是基类中的任何代码都可以在设计时运行。您添加到派生类的代码不会。

修复它很容易,使用DesignTime属性来防止计时器在设计时处于活动状态。像这样:

    timer2.Enabled = !this.DesignTime;    // Instead of true

对于不希望在设计模式下运行的代码,可以使用以下条件:

if (!this.DesignMode)
{
// Code here only executes when running, not in design mode
}

这是因为计时器也在设计时运行。您应该测试代码是否在DesignMode下运行:

private void timer2_Tick(object sender, EventArgs e)
{
    if( this.DesignMode ) return; 
    try
    {
        if ( !CheckLock())
        {
            MessageBox.Show("No lock found.");
            this.Close();
        }
    }
    catch (Exception ex)
    {
        MessageBox.Show("No lock found.");
        this.Close();
    }
}

授予在设计时运行的控件、属性、事件和计时器和构建具有丰富设计时功能的Windows窗体控件和组件以获取更多背景信息。