61 votes

Comment savoir si .NET code est exécuté par le concepteur Visual Studio

J'obtiens des erreurs jeté dans mon code quand j'ouvre Windows Forms formulaire dans Visual Studio du designer. Je voudrais créer une branche dans mon code et d'effectuer une initialisation différents si le formulaire est ouvert par le designer que si elle est en cours d'exécution pour de vrai.

Comment puis-je déterminer au moment de l'exécution si le code est exécuté dans le cadre de concepteur de l'ouverture de la forme?

53voto

NET3 Points 535
if (System.ComponentModel.LicenseManager.UsageMode == System.ComponentModel.LicenseUsageMode.Designtime)
{
  // Design time logic
}

52voto

Roger Lipscombe Points 34344

Pour savoir si vous êtes en "mode création":

  • Windows Forms composants (et de contrôle) ont un DesignMode de la propriété.
  • Windows Presentation Foundation contrôles doivent utiliser le IsInDesignMode propriété attachée.

18voto

JohnV Points 395

Le Contrôle.Propriété DesignMode est probablement ce que vous cherchez. Il vous indique si le contrôle parent est ouvert dans le concepteur.

Dans la plupart des cas, il fonctionne très bien, mais il y a des cas où ça ne fonctionne pas comme prévu. Tout d'abord, il ne fonctionne pas dans le contrôle du constructeur. Deuxièmement, DesignMode est faux pour les "petit-fils" contrôles. Par exemple, DesignMode sur les contrôles hébergé dans un UserControl retourne false lorsque le contrôle UserControl est hébergé dans l'un des parents.

Il est assez facile de contourner le problème. Il va quelque chose comme ceci:

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

Je n'ai pas testé ce code, mais il doit travailler.

18voto

GWLlosa Points 10701

Le plus fiable est:

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

15voto

Marty Dill Points 4298

Le moyen le plus fiable pour ce faire est d'ignorer la propriété DesignMode et d'utiliser votre propre drapeau qui va mettre de démarrage de l'application.

Classe:

public static class Foo
{
    public static bool IsApplicationRunning { get; set; }
}

Programme.cs:

[STAThread]
static void Main()
{
     Foo.IsApplicationRunning = true;
     // ... code goes here ...
}

Ensuite, il suffit de cocher le drapeau qu'on en a besoin.

if(Foo.IsApplicationRunning)
{
    // Do runtime stuff
}
else
{
    // Do design time stuff
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X