117 votes

Détection du mode de conception à partir du constructeur d'un contrôle

Dans le prolongement de cette question est-il possible de détecter si l'on est en mode conception ou en mode exécution à partir du constructeur d'un objet ?

Je me rends compte que ce n'est peut-être pas possible et que je devrai modifier ce que je veux, mais pour l'instant, c'est cette question spécifique qui m'intéresse.

216voto

adrianbanks Points 36858

Vous pouvez utiliser le LicenceUsageMode dans l'énumération System.ComponentModel espace de noms :

bool designMode = (LicenseManager.UsageMode == LicenseUsageMode.Designtime);

2 votes

Une solution élégante, qui fonctionne mieux que la fonctionnalité C#. ISite.DesignMode .

12 votes

@Filip Kunc : si cela ne fonctionne pas dans OnPaint, vous pouvez vérifier cette condition dans le constructeur et la stocker dans un champ de classe.

3 votes

Cela ne fonctionne pas non plus lorsque l'on surcharge WndProc dans un contrôle utilisateur. Il faut utiliser la suggestion de @IMil

27voto

Jarek Points 2092

Vous cherchez quelque chose comme ça :

public static bool IsInDesignMode()
{
    if (Application.ExecutablePath.IndexOf("devenv.exe", StringComparison.OrdinalIgnoreCase) > -1)
    {
        return true;
    }
    return false;
}

Vous pouvez également le faire en vérifiant le nom du processus :

if (System.Diagnostics.Process.GetCurrentProcess().ProcessName == "devenv")
   return true;

4 votes

Fonctionne dans OnPaint, les classes dérivées, les constructeurs, etc. La meilleure solution à ce jour.

17 votes

IMHO, cela ressemble à une solution hideuse.

7 votes

Attention à une possible fuite de mémoire ici. Le processus doit être éliminé.

11voto

Vaclav Svara Points 171

Component ... pour autant que je sache, ne possède pas la propriété DesignMode. Cette propriété est fournie par Control. Mais le problème est que lorsque le CustomControl est situé dans un formulaire dans le designer, ce CustomControl fonctionne en mode d'exécution.

J'ai constaté que la propriété DesignMode ne fonctionne correctement que dans le formulaire.

0 votes

Merci pour le conseil ! Je n'avais jamais réalisé cela auparavant, mais c'est parfaitement logique. L'utilisation de la méthode LicenseManager fournie par adrianbanks fonctionne parfaitement dans ces cas, où le contrôle est intégré dans un autre contrôle/formulaire. +1 pour chacun !

2 votes

+1 Vous avez tout à fait raison, c'est aussi mon expérience. Lorsque vous placez un contrôle d'utilisateur sur un formulaire, s'il y a des événements de mouseenter ou de chargement, DesignMode apparaîtra toujours comme faux parce que vous n'êtes pas en designmode pour ce contrôle. D'après mon expérience, cela fait planter Visual Studio assez violemment.

5voto

Ula Krukar Points 1950

Vous devez utiliser la propriété Component.DesignMode. Pour autant que je sache, elle ne doit pas être utilisée à partir d'un constructeur.

10 votes

Cela ne fonctionne pas lorsque votre contrôle se trouve à l'intérieur d'un autre contrôle ou formulaire en cours de conception.

1 votes

En fait, cela fonctionne très bien dans mes composants. J'ai toujours dû ajouter if (!DesignMode) aux méthodes OnPaint pour s'assurer qu'il n'y a pas de spam au moment de la conception.

2voto

user492238 Points 2478

Une autre méthode intéressante est décrite sur ce blog : http://www.undermyhat.org/blog/2009/07/in-depth-a-definitive-guide-to-net-user-controls-usage-mode-designmode-or-usermode/

En gros, il teste si l'assemblage en cours d'exécution est référencé statiquement à partir de l'assemblage d'entrée. Il contourne le besoin de suivre les noms d'assemblages ('devenv.exe', 'monodevelop.exe'..).

Cependant, cela ne fonctionne pas dans tous les autres scénarios, où l'assemblage est chargé dynamiquement (VSTO étant un exemple).

1 votes

Le lien est (effectivement) rompu. Il redirige désormais vers le dernier article du blog (actuellement 2016-03).

0 votes

Et maintenant, c'est juste un site de spam.

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