Вот что я хотел бы сделать, чтобы улучшить производительность:
1) Создайте только прямоугольники, видимые на заднем плане.
2) Произвольно связать свойство Fill каждого Rectangle с одним из нескольких StaticResources предопределенных цветов (10-20, вероятно, должно сработать).
3) Создайте раскадровку, которая анимирует эти StaticResources.
Вы бы потеряли индивидуальность каждого прямоугольника, но он должен анимироваться, не убивая ваше приложение.
РЕДАКТИРОВАТЬ - Примеры кодов
Например, добавьте некоторые ресурсы для анимации (это прямоугольники, поскольку вы не можете напрямую анимировать SolidColorBrush):
<Window.Resources>
<Rectangle x:Key="Color0" Fill="#FFFFCFFF" />
<Rectangle x:Key="Color1" Fill="#FFFFC2C2" />
<Rectangle x:Key="Color2" Fill="#FFFFEFD2" />
...
</Window.Resources>
Ваш раскадровка будет выглядеть примерно так:
<Storyboard x:Key="BackgroundAnimation" AutoReverse="True" RepeatBehavior="Forever">
<ColorAnimationUsingKeyFrames Storyboard.Target="{StaticResource Color0}"
Storyboard.TargetProperty="(Shape.Fill).(SolidColorBrush.Color)"
BeginTime="0:0:0:0"
AutoReverse="True"
Duration="00:00:03.00">
<ColorKeyFrameCollection>
<EasingColorKeyFrame Value="Transparent" />
</ColorKeyFrameCollection>
</ColorAnimationUsingKeyFrames>
<!-- Add keyframes for each color, varying start and duration -->
...
</Storyboard>
В вашем коде, где вы генерируете все прямоугольники, вам необходимо привязать ресурсы. Итак, где-то в цикле вам нужно добавить:
// I'll leave the implementation of GetRandomColorId to you
resourceId = GetRandomColorId(MAX_COLORS);
Shape source = (Shape)this.FindResource("Color" + resourceId);
Binding binding = new Binding
{
Path = new PropertyPath("Fill"),
Source = source
};
rect.SetBinding(Shape.FillProperty, binding);
Наконец, все, что вам нужно сделать, это запустить BackgroundAnimation.