C#用户控件在设计模式下也会启动计时器

4
我有以下问题:
我制作了一个用户控件库(DLL),其中只有一个启用的定时器。当我尝试在应用程序中使用此控件时,只要我将其拖到设计模式下的表单中,它就开始计数!即使应用程序没有运行....我该如何避免这种情况?
我的目标是,在应用程序启动时开始计时器,而不是在设计模式下...因为计时器使用一些外部函数,在设计模式下会导致崩溃。
谢谢您的帮助!
Dario

尝试删除您创建的用户控件,然后再次创建一个新的。 - jhyap
6个回答

3
您可以检查 ControlDesignMode 属性:
if (!this.DesignMode) {
    // its not in design mode.. so do stuff.
}

也许更简洁的方式是:

yourTimer.Enabled = !this.DesignMode;

2
Timer_Tick(object sender, EventArgs e)
{
    if(this.DesignMode)
       return;
    //Rest of your code here
}

1
除了从表单中添加新的“用户控件”之外,您还可以通过在“Form1.Designer.cs”中编写代码来创建自己的“用户控件”。
using System.Windows.Forms;

public class MyTimer : Timer
{
    public MyTimer()
    {
        // Set your custom timer properties here.
        this.Enabled = false;
    }
}

1

检查控件的构造函数中是否未启动Timer - 这是出现此行为的最可能原因。


1
您可能在GUI线程外启动了定时器,导致现在它在滴答声。 我建议这发生在您控件的构造函数中。 将其更改为单独的方法或发布一些代码以清晰地了解您的问题。

抱歉,我从解决方案中复制了这个... :S - Smartis
这仍将在设计模式下启动计时器。 - Sriram Sakthivel

0

就像许多人所说的那样,您可以检查控件是否处于设计模式。

您可能会遇到的问题是,Control.DesignMode 属性对于嵌套控件无法正常工作;它总是返回 false

这里有一个修复版本,您可以使用它来代替:

public static bool IsDesignMode(Control control)
{
    if (LicenseManager.UsageMode == LicenseUsageMode.Designtime)  // Initial quick check.
    {
        return true;
    }

    while (control != null)
    {
        System.ComponentModel.ISite site = control.Site;

        if ((site != null) && (site.DesignMode))
            return true;

        control = control.Parent;
    }

    return false;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接