C # - заблокировать выполнение кода в конструкторе - PullRequest
2 голосов
/ 05 мая 2009

Я выполняю строку кода, которая не может быть выполнена в конструкторе, в результате чего все открытые свойства моего элемента управления больше не отображаются в конструкторе. Из-за этого я больше не вижу ни одной из своих форм, использующих этот элемент управления, в представлении разработки Visual Studios.

Рассматриваемая строка кода вызывает небезопасный проект кода, который немного обрабатывает изображения; комментирование этого заставляет представление дизайна возвращаться к жизни. Тем не менее, код выполняется отлично, поэтому я не могу понять, почему код не работает в конструкторе. Это код, который вызывается:

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

(Предоставлено сообществом OpenNETCF)

Мой проект не помечен как небезопасный, но проект, в котором находится вышеуказанный код, помечен как небезопасный. Обе проекты должны быть помечены как небезопасные?

Или, есть ли способ, которым я могу заблокировать эту строчку кода в конструкторе (мне на самом деле не нужен вывод этого кода в режиме конструктора, поскольку он просто генерирует отключенную версию изображения из предоставленного изображения ).

РЕДАКТИРОВАТЬ: Блокировка кода от запуска не решает проблему. Только комментирование строки позволяет представлению дизайна работать. Наличие строки (даже если она вставлена ​​в оператор if [false == true]) заставляет конструктор отображать ошибки вместо формы.

Ответы [ 2 ]

5 голосов
/ 05 мая 2009

Обернуть часть кода в if:

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

Если вы используете Compact Framework, используйте это:

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

См. в этом посте о режиме информации о том, что зверь DesignMode на самом деле.

3 голосов
/ 19 апреля 2013

Я не создал это, но подумал, что добавлю полезный трюк, найденный -> здесь <- </a>.

Просто добавьте это к своему элементу управления и используйте его соответствующим образом.

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

Или для нас, ребята из VB.NET:

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