89 votes

DesignMode avec des contrôles

Quelqu'un a trouvé une solution utile à la DesignMode problème lors de l'élaboration de contrôles?

Le problème est que si vous imbriquez des contrôles puis DesignMode ne fonctionne que pour le premier niveau. La deuxième et la baisse des niveaux DesignMode renverra toujours FALSE.

La norme hack a été à regarder le nom du processus qui est en cours d'exécution et si elle est "DevEnv.EXE" ensuite, il doit être en studio ainsi DesignMode est vraiment VRAI.

Le problème est à la recherche pour le ProcessName travaille son chemin à travers la base de registre et autres étranges pièces avec le résultat final que l'utilisateur peut ne pas avoir les droits requis pour voir le nom du processus. En outre, cette étrange itinéraire est très lent. Nous avons donc dû pile supplémentaire hacks à l'utilisation d'un singleton, et si une erreur est renvoyée lors de la demande du nom du processus alors supposer que DesignMode est FAUX.

Une belle propre façon de déterminer DesignMode est dans l'ordre. En fait obtenir de Microsoft pour régler cela en interne dans le cadre serait encore mieux!

82voto

Benjol Points 16334

Un réexamen de cette question, j'ai "découvert" 5 façons différentes de le faire, qui sont comme suit:

System.ComponentModel.DesignMode property

System.ComponentModel.LicenseManager.UsageMode property

private string ServiceString()
{
    if (GetService(typeof(System.ComponentModel.Design.IDesignerHost)) != null) 
        return "Present";
    else
        return "Not present";
}

public bool IsDesignerHosted
{
    get
    {
        Control ctrl = this;

        while(ctrl != null)
        {
            if((ctrl.Site != null) && ctrl.Site.DesignMode)
                return true;
            ctrl = ctrl.Parent;
        }
        return false;
    }
}
public static bool IsInDesignMode()
{
    return System.Reflection.Assembly.GetExecutingAssembly()
         .Location.Contains("VisualStudio"))
}

Pour essayer et obtenir un blocage sur les trois solutions proposées, j'ai créé un petit test de la solution de trois projets:

  • TestApp (winforms application),
  • SubControl (dll)
  • SubSubControl (dll)

J'ai ensuite intégré la SubSubControl dans le SubControl, puis un de chaque dans la TestApp.Forme.

Cette capture d'écran montre le résultat lors de l'exécution. Screenshot of running

Cette capture d'écran montre le résultat avec le formulaire ouvert dans Visual Studio:

Screenshot of not running

Conclusion: Il semble que, sans réflexion, la seule qui soit fiable dans le constructeur est LicenseUsage, et la seule qui soit fiable à l'extérieur le constructeur est "IsDesignedHosted' (par BlueRaja ci-dessous)

33voto

À partir de cette page:

([Édition 2013] Modifié pour fonctionner dans les constructeurs, à l'aide de la méthode fournie par @hopla)

/// <summary>
/// The DesignMode property does not correctly tell you if
/// you are in design mode.  IsDesignerHosted is a corrected
/// version of that property.
/// (see https://connect.microsoft.com/VisualStudio/feedback/details/553305
/// and http://stackoverflow.com/a/2693338/238419 )
/// </summary>
public bool IsDesignerHosted
{
    get
    {
        if (LicenseManager.UsageMode == LicenseUsageMode.Designtime)
            return true;

        Control ctrl = this;
        while (ctrl != null)
        {
            if ((ctrl.Site != null) && ctrl.Site.DesignMode)
                return true;
            ctrl = ctrl.Parent;
        }
        return false;
    }
}

J'ai soumis un bug en rapport avec Microsoft; je doute qu'il va passer n'importe où, mais vote it up de toute façon, comme c'est évidemment un bug (que ce soit ou non c'est "by design").

29voto

hopla Points 697

Pourquoi ne pas consulter LicenseManager.UsageMode. Cette propriété peut avoir les valeurs LicenseUsageMode.Runtime ou LicenseUsageMode.Designtime.

Est que vous voulez code à exécuter uniquement au moment de l’exécution, utilisez le code suivant :

7voto

husayt Points 4384

Il s’agit de la méthode que j’utilise à l’intérieur de formes :

De cette façon, le résultat sera correct, même si une des propriétés DesignMode ou LicenseManager échouent.

3voto

juFo Points 3779

Nous utilisons ce code avec succès :

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