Pregunta

Estoy ejecutando una línea de código que no se ejecuta dentro del diseñador, lo que hace que todas las propiedades públicas de mi control ya no aparezcan en el diseñador. Debido a esto, ya no puedo ver ninguno de mis formularios que usan ese control en la Vista de diseño de Visual Studios.

La línea de código en cuestión llama a un proyecto de código inseguro que procesa un poco la imagen; comentarlo hace que la vista del diseño vuelva a la vida. Sin embargo, el código se ejecuta perfectamente, por lo que no puedo ver por qué el código falla en el diseñador. Este es el código que se llama:

        /// <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;
        }

(Cortesía de la comunidad OpenNETCF)

Mi proyecto no está marcado como inseguro, pero el proyecto en el que se encuentra el código anterior está marcado como inseguro. ¿Es necesario marcar ambos proyectos como inseguros?

O bien, ¿hay alguna manera de bloquear esa línea de código que se activa en el diseñador? ).

EDITAR: Bloquear la ejecución del código no soluciona el problema. Solo comentar la salida de línea permite que la vista de diseño funcione. Tener la línea (incluso cuando se coloca en una instrucción if [false == true]) hace que el diseñador muestre errores, en lugar del formulario.

¿Fue útil?

Solución

Envuelva la parte del código en if:

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

Si está usando Compact Framework, use esto:

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

Consulte esta publicación sobre información del modo en qué bestia DesignMode es en realidad.

Otros consejos

No creé esto, pero pensé que agregaría un truco útil encontrado - & Gt; here & Lt; - .

Simplemente agregue esto a su control y úselo apropiadamente.

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

O para nosotros amigos de VB.NET:

  Public Shared ReadOnly Property IsDesignMode() As Boolean
    Get
      Return AppDomain.CurrentDomain.FriendlyName.Contains("DefaultDomain")
    End Get
  End Property
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top