Вот мое решение (совместимое с Silverlight).
IEnumerable<Color> VaryingColors(int seedIndex)
{
int maxValue = 1 << 24;
int index = seedIndex % maxValue;
while (true)
{
byte r = 0;
byte g = 0;
byte b = 0;
for (int i = 0; i < 24; i++)
{
if ((index & (1 << i)) != 0)
{
switch (i % 3)
{
case 0: r |= (byte)(1 << (23 - i) / 3); break;
case 1: g |= (byte)(1 << (23 - i) / 3); break;
case 2: b |= (byte)(1 << (23 - i) / 3); break;
}
}
}
yield return Color.FromArgb(0xFF, r, g, b);
index = (index + 1) % maxValue;
}
}
Вот пример использования. Создайте новое приложение Silverlight и добавьте ListBox
файл MainPage.xaml следующим образом: -
<ListBox ItemsSource="{Binding}">
<ListBox.ItemTemplate>
<DataTemplate>
<Rectangle Width="200" Height="20" Fill="{Binding}" />
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
В конструкторе MainPage.Xaml.cs включите код, подобный следующему: -
DataContext = VaryingColors(0).Take(100).Select(c => new SolidColorBrush(c));
Генератор цвета сгенерирует все 16 миллионов возможных цветов и сначала будет манипулировать самыми значимыми битами компонентов R G B. Может потребоваться немного больше работы, есть некоторые вхождения смежных цветов, которые более похожи, чем остальная часть последовательности, хотя они всегда заметно различаются.
Одним из улучшений может быть добавление фильтра в последовательность для отбрасывания слишком темных цветов или с очень низкой насыщенностью. Фактически может быть добавлен другой фильтр, чтобы отбрасывать цвет, который имеет оттенок, близкий к предыдущему цвету в последовательности.