0

我正在使用 Silverlight 在图像上绘制一些形状和文本。这些形状使用一组通用的渐变颜色,因此我有一组预定义的 GradientStopCollections,我打算用它来定义用于填充形状的画笔。只要我最多只使用每个 GradientStopCollections 一次,它就可以工作。如果我再次尝试使用 GradientStopCollections 之一实例化 LinearGradientBrush,它会引发 ArgumentException,说明“值不在预期范围内”。

        _yellowFill = new GradientStopCollection();
        _yellowFill.Add(new GradientStop(){ Color = Color.FromArgb(128, 255, 255, 0), Offset = 0 });
        _yellowFill.Add(new GradientStop() { Color = Color.FromArgb(128, 128, 128, 0), Offset = 1 });

...

        _shapeLinearFillBrush = new LinearGradientBrush(_yellowFill, 90);
        ...
        _shapeLinearFillBrush = new LinearGradientBrush(_yellowFill, 90);

上面的最后一行将抛出异常。为什么会抛出此异常,如何使用 GradientStopCollections 定义多个渐变画笔?

4

1 回答 1

2

我相信这个问题与 Silverlight 缺少可冻结对象有关。如果您使用的是 WPF,这应该不是问题。Silverlight 中无法重用相同的 GradientStopCollection。我认为您甚至不能使用相同的 GradientStop。要解决此问题,您可以在克隆 GradientStopCollection 上创建一个扩展方法,如下所示:

_yellowFill = new GradientStopCollection();
_yellowFill.Add(new GradientStop() { Color = Color.FromArgb(128, 255, 255, 0), Offset = 0 });
_yellowFill.Add(new GradientStop() { Color = Color.FromArgb(128, 128, 128, 0), Offset = 1 });

_shapeLinearFillBrush1 = new LinearGradientBrush(_yellowFill.Clone(), 90);
_shapeLinearFillBrush2 = new LinearGradientBrush(_yellowFill.Clone(), 90);

public static GradientStopCollection Clone(this GradientStopCollection stops)
{
    var collection = new GradientStopCollection();

    foreach (var stop in stops)
        collection.Add(new GradientStop() { Color = stop.Color, Offset = stop.Offset });

    return collection;
}
于 2012-06-14T19:30:49.890 回答