2012-06-06 1 views
0

Я использую Silverlight для рисования некоторых фигур и текста поверх изображения. Формы используют общий набор цветов градиента, поэтому у меня есть предопределенный набор GradientStopCollections, который я намеревался использовать для определения кистей, используемых для заполнения фигур. Это работает до тех пор, пока я использую только каждый из GradientStopCollections до одного раза. Если я попытаюсь создать экземпляр LinearGradientBrush с помощью одного из GradientStopCollections во второй раз, он выдает исключение ArgumentException, в котором указано, что «Значение не входит в ожидаемый диапазон».Почему повторное использование 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 }); 

...

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

Последняя строка выше будет бросать исключение. Почему это бросает это исключение и как я могу использовать свой GradientStopCollections для определения нескольких градиентных кистей?

+0

вы пробовали ссылки на коллекцию в качестве статического ресурса вместо (например, в вашем app.xaml)? –

+0

@HiTechMagic Нет. Я динамически создаю FrameworkElements для размещения на холсте, поэтому я также динамически создаю свои кисти (потому что я буду изменять их индивидуально в ответ на события позже). Какая разница, если бы я сделал? – xr280xr

+0

Просто мозговой штурм ... Возможно, что GradientStopCollection() разрешен только в одном родителе. Мне нужно будет углубиться в разборку GradientStopCollection, чтобы понять, почему и вернуться к вам. –

ответ

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; 
} 
+0

Спасибо @tjscience! Это был тот же самый вывод, к которому я пришел, и я закончил тем, что объявил GradientStopCollections более или менее как шаблоны и клонировал их, а не использовал их напрямую. Я все еще не понимаю, почему отсутствие Freezable вызывает исключение. Как он знает, что GradientStopCollection уже используется и зачем ему это нужно? – xr280xr

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