如何判断Visual Studio设计器是否正在运行.NET代码

时间:2020-03-05 18:56:17  来源:igfitidea点击:

在Visual Studio设计器中打开Windows窗体窗体时,我的代码中引发了一些错误。如果设计者正在打开窗体,而实际运行时,我想分支代码并执行不同的初始化。

如何在运行时确定是否在设计者打开表单的过程中执行了代码?

解决方案

回答

System.Diagnostics.Debugger.IsAttached

回答

我不确定在调试模式下运行是否是真实的,但是一种简单的方法是在代码中包含一个if语句来检查System.Diagnostics.Debugger.IsAttached。

回答

这有点骇人听闻,但是如果我们使用的是VB.NET,并且在Visual Studio中运行时,My.Application.Deployment.CurrentDeployment将为Nothing,因为我们尚未进行部署。我不确定如何检查C#中的等效值。

回答

我们检查控件的DesignMode属性:

if (!DesignMode)
{
//Do production runtime stuff
}

请注意,这在构造函数中将不起作用,因为尚未初始化组件。

回答

如果我们使用的是表单或者控件,则可以使用DesignMode属性:

if (DesignMode)
{
        DesignMode Only stuff
}

回答

要了解我们是否处于"设计模式":

  • Windows Forms组件(和控件)具有DesignMode属性。
  • Windows Presentation Foundation控件应使用IsInDesignMode添加属性。

回答

System.ComponentModel.Component.DesignMode == true

回答

Control.DesignMode属性可能是我们要寻找的。它告诉我们控件的父级是否在设计器中打开。

在大多数情况下,它工作得很好,但是在某些情况下,它并没有达到预期的效果。首先,它在控件构造函数中不起作用。其次,对于"孙子"控件,DesignMode为false。例如,当UserControl托管在父级中时,UserControl托管的控件上的DesignMode将返回false。

有一个非常简单的解决方法。它是这样的:

public bool HostedDesignMode
{
  get 
  {
     Control parent = Parent;
     while (parent!=null)
     {
        if(parent.DesignMode) return true;
        parent = parent.Parent;
     }
     return DesignMode;
  }
}

我没有测试过该代码,但它应该可以工作。

回答

最可靠的方法是:

public bool isInDesignMode
{
    get
    {
        System.Diagnostics.Process process = System.Diagnostics.Process.GetCurrentProcess();
        bool res = process.ProcessName == "devenv";
        process.Dispose();
        return res;
    }
}

回答

我们在UserControls中使用以下代码,即可完成工作。如其他成员所指出的那样,仅使用DesignMode在使用自定义用户控件的应用程序中将不起作用。

public bool IsDesignerHosted
    {
        get { return IsControlDesignerHosted(this); }
    }

    public bool IsControlDesignerHosted(System.Windows.Forms.Control ctrl)
    {
        if (ctrl != null)
        {
            if (ctrl.Site != null)
            {
                if (ctrl.Site.DesignMode == true)
                    return true;
                else
                {
                    if (IsControlDesignerHosted(ctrl.Parent))
                        return true;
                    else
                        return false;
                }
            }
            else
            {
                if (IsControlDesignerHosted(ctrl.Parent))
                    return true;
                else
                    return false;
            }
        }
        else
            return false;
    }

回答

我发现DesignMode属性存在漏洞,至少在Visual Studio的早期版本中是如此。因此,我使用以下逻辑制作了自己的作品:

Process.GetCurrentProcess().ProcessName.ToLower().Trim() == "devenv";

我知道这有点骇人听闻,但效果很好。