Насколько хорошо знать заранее значение 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 из деки.
Проблема в том, что GradientStop не является производным от FrameworkElement , поэтому не может быть привязан к данным. К сожалению, это означает, что вам нужно установить его из кода.
Подтвердили ли вы, что тип используется в качестве DataContext
, в котором определяется ваша градиентная кисть? Поскольку вы не указали Source
в своей привязке, по умолчанию он будет использовать DataContext
.
Чтобы это действительно произошло, у вас есть два варианта.
Свяжите свойство "Кисть" отображаемых элементов со свойством "Кисть" в данных.
Попросите источник данных иметь свойство, указывающее, какую кисть вы хотите использовать для каждого элемента, и привяжите свойство отображаемого элемента, которое принимает кисть, скажем, свойство 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;
}
Предостережение
Когда происходит привязка данных создается целая куча кистей по одной для каждого элемента. Это может быть дорого и нежелательно. Следовательно, если этот подход с преобразователем привязки считается необходимым, я бы рекомендовал вам использовать статический словарь кистей. Ключом к этому словарю будет хэш двух цветов. Вы можете создавать новую кисть только при необходимости и повторно использовать ранее созданную кисть, когда это возможно.
Следовательно, если этот подход с преобразователем привязки считается необходимым, я бы рекомендовал вам использовать статический словарь кистей. Ключом к этому словарю будет хэш двух цветов. Вы можете создавать новую кисть только при необходимости и повторно использовать ранее созданную кисть, когда это возможно. Следовательно, если этот подход с преобразователем привязки считается необходимым, я бы рекомендовал вам использовать статический словарь кистей. Ключом к этому словарю будет хэш двух цветов. Вы можете создавать новую кисть только при необходимости и повторно использовать ранее созданную кисть, когда это возможно.