Как связать Цвета GradientStop или Свойство GradientStops в Silverlight?

Насколько хорошо знать заранее значение maxium, можно сделать этот путь:

class NoLoopRand
  def initialize(max)
    @deck = (0..max).to_a
  end

  def getrnd
    return @deck.delete_at(rand(@deck.length - 1))
  end
end

и можно получить случайные данные таким образом:

aRndNum = NoLoopRand.new(10)
puts aRndNum.getrnd

Вы получите nil, когда все значения будут exausted из деки.

5
задан Drew Noakes 3 October 2009 в 15:01
поделиться

3 ответа

Проблема в том, что GradientStop не является производным от FrameworkElement , поэтому не может быть привязан к данным. К сожалению, это означает, что вам нужно установить его из кода.

13
ответ дан 18 December 2019 в 09:08
поделиться

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

0
ответ дан 18 December 2019 в 09:08
поделиться

Чтобы это действительно произошло, у вас есть два варианта.

Свяжите свойство "Кисть" отображаемых элементов со свойством "Кисть" в данных.

Попросите источник данных иметь свойство, указывающее, какую кисть вы хотите использовать для каждого элемента, и привяжите свойство отображаемого элемента, которое принимает кисть, скажем, свойство Fill . Это работает, если набор различных значений, которые вы имели бы для пар значений Start и Stop, невелик. Вы должны создать экземпляр каждой кисти для каждой пары, а затем элемент данных покажет правильный.

Свяжите отображаемые элементы со свойством Brush с помощью преобразователя значений

Если ваши Start и Stop означают дополнительные переменные, вам потребуется новый экземпляр типа Brush для каждого отображаемого элемента. В этом случае вы должны привязать свойство кисти отображаемых элементов с помощью преобразователя значений, например: -

 <Rectangle Fill="{Binding Converter={StaticResource MyBrushBuilder} }" ... >

См. Этот ответ для полного описания построения конвертера.

В этом случае, хотя ваша реализация метода convert будет выглядеть так: -

public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
  YourItemsType item = (YourItemsType)value;

  var start = new GradientStop();
  start.Offset = 0;
  start.Color = item.GradientStart;

  var stop = new GradientStop();
  stop.Offset = 1;
  stop.Color = item.GradientStop;

  var result = new RadialGradientBrush();
  result.GradientOrigin = new Point(0.20, 0.5);
  result.Center = new Point(0.25, 0.5);
  result.RadiusX = 0.75;
  result.RadiusY = 0.5;
  result.GradientStops = new GradientStopCollection();
  result.GradientStops.Add(start);
  result.GradientStops.Add(stop);

  return result;
}

Предостережение

Когда происходит привязка данных создается целая куча кистей по одной для каждого элемента. Это может быть дорого и нежелательно. Следовательно, если этот подход с преобразователем привязки считается необходимым, я бы рекомендовал вам использовать статический словарь кистей. Ключом к этому словарю будет хэш двух цветов. Вы можете создавать новую кисть только при необходимости и повторно использовать ранее созданную кисть, когда это возможно.

Следовательно, если этот подход с преобразователем привязки считается необходимым, я бы рекомендовал вам использовать статический словарь кистей. Ключом к этому словарю будет хэш двух цветов. Вы можете создавать новую кисть только при необходимости и повторно использовать ранее созданную кисть, когда это возможно.

Следовательно, если этот подход с преобразователем привязки считается необходимым, я бы рекомендовал вам использовать статический словарь кистей. Ключом к этому словарю будет хэш двух цветов. Вы можете создавать новую кисть только при необходимости и повторно использовать ранее созданную кисть, когда это возможно.

5
ответ дан 18 December 2019 в 09:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: