À la suite de cette question , est-il possible de détecter si l'on est en mode conception ou en mode exécution depuis le constructeur d'un objet?
Je me rends compte que ce n'est peut-être pas possible et que je vais devoir changer ce que je veux, mais pour l'instant je m'intéresse à cette question précise.
ISite.DesignMode
.Cherchez-vous quelque chose comme ça:
Vous pouvez également le faire en vérifiant le nom du processus:
la source
devenv
.Component ... pour autant que je sache, n'a pas la propriété DesignMode. Cette propriété est fournie par Control. Mais le problème est que lorsque CustomControl se trouve dans un formulaire dans le concepteur, ce CustomControl s'exécute en mode d'exécution.
J'ai constaté que la propriété DesignMode ne fonctionne correctement que dans Form.
la source
Les contrôles (Forms, UserControls, etc.) héritent de
Component class
ce qui abool property DesignMode
:la source
OnHandleCreated
.IMPORTANT
Il y a une différence entre l'utilisation de Windows Forms ou de WPF !!
Ils ont des concepteurs différents et ont besoin de différents contrôles . De plus, c'est délicat lorsque vous mélangez des formulaires et des contrôles WPF. (par exemple, les contrôles WPF à l'intérieur d'une fenêtre Forms)
Si vous disposez uniquement de Windows Forms , utilisez ceci:
Si vous avez WPF uniquement , utilisez cette vérification:
Si vous avez une utilisation mixte de Forms et WPF, utilisez une vérification comme celle-ci:
Pour voir le mode actuel, vous pouvez afficher une MessageBox pour le débogage:
Remarque:
Vous devez ajouter les espaces de noms System.ComponentModel et System.Diagnostics .
la source
Vous devez utiliser la propriété Component.DesignMode. Autant que je sache, cela ne devrait pas être utilisé à partir d'un constructeur.
la source
if (!DesignMode)
méthodes OnPaint pour m'assurer qu'il ne spammait pas le moment de la conception.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 -mode utilisateur/
Fondamentalement, il teste l'assembly en cours d'exécution référencé statiquement à partir de l'assembly d'entrée. Cela évite d'avoir à suivre les noms d'assemblages («devenv.exe», «monodevelop.exe» ..).
Cependant, cela ne fonctionne pas dans tous les autres scénarios, où l'assembly est chargé dynamiquement (VSTO en est un exemple).
la source
Avec la coopération du concepteur ... Il peut être utilisé dans les contrôles, les composants, dans tous les endroits
MessageBox.Show(
les lignes doivent être supprimées. Cela me garantit seulement que cela fonctionne correctement.la source
Vous pouvez utiliser ceci
la source
C'est la méthode que j'ai utilisée dans mon projet:
Attention !!!: Le code retourné booléen indique PAS en mode conception!
la source
la source
La solution LicenseManager ne fonctionne pas dans OnPaint, cela non plus. J'ai eu recours à la même solution que @Jarek.
Voici la version en cache:
Sachez que cela échouera si vous utilisez un IDE tiers ou si Microsoft (ou votre utilisateur final) décide de changer le nom de l'exécutable VS en autre chose que «devenv». Le taux d'échec sera très faible, assurez-vous simplement de traiter toutes les erreurs qui pourraient survenir dans le code qui échoue à la suite de cela et tout ira bien.
la source
Si vous souhaitez exécuter certaines lignes lorsqu'il est en cours d'exécution mais pas dans le concepteur Visual Studio, vous devez implémenter la propriété DesignMode comme suit:
la source
Les minuteries activées par défaut peuvent provoquer des plantages lors de l'utilisation de contrôles personnalisés / utilisateur. Désactivez-les par défaut et activez-les uniquement après la vérification du mode de conception
la source