Question

J'exécute une ligne de code dont l'exécution échoue dans le concepteur, de sorte que toutes les propriétés publiques de mon contrôle ne s'affichent plus dans le concepteur. Pour cette raison, aucun de mes formulaires utilisant ce contrôle dans Visual Studio Design View ne s'affiche.

La ligne de code en question appelle un projet de code non sécurisé qui effectue un peu de traitement d'image. en le commentant, la vue de conception reprend vie. Cependant, le code s'exécute parfaitement et je ne vois donc pas pourquoi le code échoue dans le concepteur. C'est le code qui est appelé:

        /// <summary>
        /// Performs a color adjustment on the source bitmap. 
        /// </summary>
        /// <param name="source">The bitmap to be processed. This is changed by the
        /// process action.</param>
        /// <param name="redChange">change to the red value. Can be negative.</param>
        /// <param name="greenChange">change to the green value. Can be negative.</param>
        /// <param name="blueChange">change to the blue value. Can be negative.</param>
        /// <returns></returns>
        public static Bitmap ProcessColor(Bitmap source, int redChange, int greenChange, int blueChange)
        {
            sourceBitmap = source;

            // lock the source bitmap
            sourceBitmapData = getBitmapData(sourceBitmap, ref sourceWidth);
            sourcepBase = (Byte*)sourceBitmapData.Scan0.ToPointer();

            PixelData* pPixel;

            for (int y = 0; y < source.Height; y++)
            {
                pPixel = (PixelData*)(sourcepBase + y * sourceWidth);
                for (int x = 0; x < source.Width; x++)
                {
                    int redVal = pPixel->red + redChange;
                    if ( redVal <0 ) redVal = 0;
                    if ( redVal > 255) redVal = 255;
                    pPixel->red = (byte)redVal;

                    int greenVal = pPixel->green + greenChange;
                    if ( greenVal <0 ) greenVal = 0;
                    if ( greenVal > 255) greenVal = 255;
                    pPixel->green = (byte)greenVal;

                    int blueVal = pPixel->blue + blueChange;
                    if (blueVal < 0) blueVal = 0;
                    if (blueVal > 255) blueVal = 255;
                    pPixel->blue = (byte)blueVal;

                    pPixel++;
                }
            }

            sourceBitmap.UnlockBits(sourceBitmapData);
            sourceBitmapData = null;
            sourcepBase = null;

            return source;
        }

(Gracieuseté de la communauté OpenNETCF)

Mon projet n'est pas marqué comme non sécurisé, mais le projet dans lequel se trouve le code ci-dessus est marqué comme non sécurisé. Les deux projets doivent-ils être marqués comme dangereux?

Ou, y a-t-il un moyen de bloquer cette ligne de code dans le concepteur (je n'ai pas besoin de la sortie de ce code en mode conception, car il ne fait que générer une version désactivée d'une image à partir d'une image fournie ).

EDIT: le blocage du code en cours d'exécution ne résout pas le problème. Seul le commentaire de la sortie permet à la vue de conception de fonctionner. La présence de la ligne (même si elle est insérée dans une instruction if [false == true]) entraîne l'affichage des erreurs par le concepteur au lieu du formulaire.

Était-ce utile?

La solution

Insérer la partie de code dans if:

if(!DesignMode)
{
    // Your "unsafe" code goes here
}

Si vous utilisez Compact Framework, utilisez ceci:

if(Site != null && !Site.DesignMode)
{
    // Your "unsafe" code goes here
}

Voir ce message sur les informations de mode sur quelle bête DesignMode est réellement.

Autres conseils

Je n'ai pas créé cela, mais je pensais ajouter une astuce utile - & Gt; ici & Lt; - .

Ajoutez simplement ceci à votre contrôle et utilisez-le de manière appropriée.

public static bool IsDesignMode
{
  get 
  { 
    return AppDomain.CurrentDomain.FriendlyName.Contains("DefaultDomain"); 
  }
}

Ou pour nous, les gens de VB.NET:

  Public Shared ReadOnly Property IsDesignMode() As Boolean
    Get
      Return AppDomain.CurrentDomain.FriendlyName.Contains("DefaultDomain")
    End Get
  End Property
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top