0

Silverlight を使用して、画像の上に図形やテキストを描画しています。シェイプはグラデーション カラーの共通セットを使用するため、シェイプの塗りつぶしに使用するブラシを定義するために使用する事前定義された GradientStopCollections のセットがあります。これは、各 GradientStopCollections を 1 回までしか使用しない限り機能します。もう一度 GradientStopCollections の 1 つを使用して 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 に答える