2015-06-12 2 views
-4

Исключения бросков при получении InterpolationColors свойства из клонированного LinearGradientBrush:Исключения после LinearGradientBrush.Clone()

LinearGradientBrush brush = new LinearGradientBrush(new Point(0, 0), new Point(100, 0), Color.White , Color.Black); 
ColorBlend colorBlend = new ColorBlend(); 
colorBlend.Colors = new Color[] {Color.White, Color.Red, Color.Black}; 
colorBlend.Positions = new float[] { 0f, 0.5f, 1f }; 
brush.InterpolationColors = colorBlend; 
ColorBlend colorBlend1 = brush.InterpolationColors; 
LinearGradientBrush brushCopy2 = (LinearGradientBrush)brush.Clone(); 
ColorBlend colorBlend2 = brushCopy2.InterpolationColors; 

Исключения бросков из последней строки.

+3

Какое исключение было бы в точности? – Sayse

+0

@ ИсключениеSayse: Необработанное исключение: System.ArgumentException: свойство должно быть установлено для допустимого объекта ColorBlend, чтобы использовать дополнительный цвет. Объект ColorBlend должен находиться в одном месте и цветовом значении. Начиная с 0,0 до 1,0. 1.0 - последний элемент в массиве. –

ответ

0

Да, получить себе копию ILSpy или использовать другой способ, чтобы вырыть вокруг источника и проблемы, как это становится все более очевидным ....

LinearGradientBrush имеет частный BOOL называется interpolationColorsWasSet

InterpolationColors является свойство, которое вызывает _GetInterpolationColors();

, который, в свою очередь начинается с

if (!this.interpolationColorsWasSet) 
{ 
    throw new ArgumentException(SR.GetString("InterpolationColorsCommon", new object[] 
    { 
     SR.GetString("InterpolationColorsColorBlendNotSet"), 
     "" 
    })); 
} 

Проблема заключается в том, что Clone копирует основную кисть GDI с помощью ее ручки и не прилагает никаких усилий для установки этого частного bool, поэтому даже если InterpolationColors , вероятно,, установленный в базовой кисти GDI. Вы всегда получите эту ошибку.

+0

Затем, если я хочу скопировать LinearGradientBrush, мне нужно скопировать InterpolationColors из исходной кисти и установить ее в кисть копирования. Есть ли другой способ получить копию LinearGradientBrush? –

+0

@PeytonXu На самом деле я подозреваю, что вы просто можете сделать 'brushCopy2.InterpolationColors = colorBlend' Поскольку метод' _SetInterpolationColors' копирует его внутренне и маршалы его в родную память в любом случае –

Смежные вопросы