C # - Блокировать выполнение кода в конструкторе
-
05-07-2019 - |
Вопрос
Я выполняю строку кода, которая не выполняется в конструкторе, в результате чего все общедоступные свойства моего элемента управления больше не отображаются в конструкторе.Из-за этого я больше не вижу ни одной из своих форм, использующих этот элемент управления, в представлении дизайна 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]) приводит к тому, что разработчик отображает ошибки вместо формы.
Решение
Оберните часть кода в if
:
if(!DesignMode)
{
// Your "unsafe" code goes here
}
Если вы используете Compact Framework, используйте это:
if(Site != null && !Site.DesignMode)
{
// Your "unsafe" code goes here
}
Видишь этот пост в режиме включения информация о том, что за зверь DesignMode
на самом деле так и есть.
Другие советы
Я не создавал это, но подумал, что добавлю найденный полезный трюк -->здесь<--.
Просто добавьте это в свой элемент управления и используйте его соответствующим образом.
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