SolidBrush.Clone выдает исключение
Я использую различные типы кистей, таких как SolidBrush
, HatchBrush
и т. д., чтобы рисовать сложные формы и текст в моих окнах контроля формы. Код, который я использую,
protected void FillShape(Brush myBrush, GraphicsPath shape)
{
if (myBrush is SolidBrush)
{
using (SolidBrush sbr = myBrush.Clone() as SolidBrush)
{
//Code for drawing with solid brush
}
}
else if (myBrush is HatchBrush)
{
//Code for drawing with hatch brush
}
else if (myBrush is LinearGradientBrush)
{
//Code for drawing with linear gradient brush
}
else if (myBrush is PathGradientBrush)
{
//Code for drawing with path gradient brush
}
}
Иногда линия myBrush.Clone()
бросает ArgumentException
, Я искал ссылку MSDN для метода SolidBrush.Clone(), но нет никакой информации о каком-либо исключении SolidBrush.Clone
Итак, я проверил исходный код для этого метода в следующей ссылке Ссылочный код для класса SolidBrush
Код, используемый в System.Drawing.SolidBrush.Clone
метод
public override object Clone()
{
IntPtr cloneBrush = IntPtr.Zero;
int status = SafeNativeMethods.Gdip.GdipCloneBrush(new HandleRef(this, this.NativeBrush), out cloneBrush);
if (status != SafeNativeMethods.Gdip.Ok)
throw SafeNativeMethods.Gdip.StatusException(status);
// We intentionally lose the "immutable" bit.
return new SolidBrush(cloneBrush);
}
Понятно, что Clone
Метод может генерировать исключение, но я не могу определить, когда и почему он будет генерировать исключение, так как этот код не мой.
Кто-нибудь знает, когда или почему будет выброшено исключение этим методом?
Редактировать:
Прикрепленное изображение, показывающее детали исключения
Кроме того, это не системная кисть, потому что immutable
свойство кисти false
1 ответ
Вы можете определить, действительно ли это Clone()
это исключение или избавление. Если вы попытаетесь удалить или изменить SystemBrush, произойдет исключение:
SystemBrushes.Control.Dispose(); // ArgumentException: Changes cannot be made to Brush because permissions are not valid.
Но клонирование, а затем удаление его работает нормально:
((Brush) SystemBrushes.Control.Clone()).Dispose(); // OK
Так что, возможно, просто избегать Clone
в целом, если вы думаете, что это проблема, например:
// instead of using clone, just make a new instance
Brush myBrush = SystemBrushes.Control;
if (myBrush is SolidBrush) {
using (var nb = new SolidBrush(((SolidBrush) myBrush).Color)) {
// ...
}
}