2

J'exécute une ligne de code qui ne s'exécute pas dans le concepteur, ce qui provoque l'affichage de toutes les propriétés publiques de mon contrôle dans le concepteur. Pour cette raison, je ne peux plus voir aucun de mes formulaires utilisant ce contrôle dans Visual Studio Design View.C# - Code de bloc à exécuter dans le concepteur

La ligne de code en question appelle un projet de code dangereux qui effectue un peu de traitement d'image; le commentant rend la vue de conception revivre à la vie. Cependant, le code s'exécute parfaitement, donc je ne vois pas pourquoi le code échoue dans le concepteur. Ceci 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; 
     } 

(Avec l'aimable autorisation de la Communauté OpenNETCF)

Mon projet n'est pas marqué comme dangereux, mais le projet que le code ci-dessus est en est marqué dangereux. Les deux projets doivent-ils être marqués comme dangereux?

Ou est-il possible de bloquer cette ligne de code dans le concepteur (je n'ai pas vraiment besoin de la sortie de ce code en mode design car il génère une version désactivée d'une image fournie image).

EDIT: Bloquer l'exécution du code ne résout pas le problème. Seul le commentaire de la ligne permet à la vue de conception de fonctionner. La présence de la ligne (même si elle est placée dans une instruction if [false == true]) amène le concepteur à afficher des erreurs au lieu du formulaire.

Répondre

5

Enveloppez la partie du code dans if:

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

Si vous utilisez Compact Framework, utilisez:

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

Voir this post sur les informations de mode sur quelle bête DesignMode est en fait .

+1

Il n'y a pas 'DesignMode' dans les FC pour autant que je peux voir. Ou est-ce dans une autre référence? – GenericTypeTea

+0

Oui, merci. Manqué ça. Edited ma réponse. –

+0

Je trouve: si (this.Site.DesignMode!) { // etc } Mais cela ne l'empêche pas la ligne de l'exécution du code – GenericTypeTea

3

Je n'ai pas créé ceci, mais j'ai pensé que j'ajouterais un truc utile trouvé -->here<--.

Ajoutez simplement ceci à votre contrôle et utilisez-le de façon appropriée.

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

Ou pour nous les gens VB.NET:

Public Shared ReadOnly Property IsDesignMode() As Boolean 
    Get 
     Return AppDomain.CurrentDomain.FriendlyName.Contains("DefaultDomain") 
    End Get 
    End Property 
+1

L'avantage de cette méthode est qu'elle fonctionne également dans le constructeur d'un contrôle. – xsl

Questions connexes