LinearGradientBrush.Clone() 之后的异常

本文关键字:异常 之后 Clone LinearGradientBrush | 更新日期: 2023-09-27 17:55:29

从克隆的 LinearGradientBrush 获取 InterpolationColors 属性时引发异常:

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;

从最后一行引发异常。

LinearGradientBrush.Clone() 之后的异常

是的,给自己一个 ILSpy 的副本或使用另一种方式来挖掘源代码,这样的问题变得更加明显......

LinearGradientBrush有一个叫做interpolationColorsWasSet的私人布尔值

InterpolationColors是一个调用_GetInterpolationColors();的属性

这反过来又以

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

问题是Clone使用其句柄复制基础 GDI 画笔,并且不努力设置此专用布尔值,因此即使插值颜色可能在基础 GDI 画笔中设置。您始终会收到此错误。