這裏就是我會做,以提高性能:
1)創建僅是在後臺可見的矩形。
2)將每個Rectangle的Fill屬性隨機綁定到預定義顏色的一個StaticResources(10-20應該可以做到這一點)。
3)創建一個動畫這些靜態資源的故事板。
你會失去每個矩形的個性,但它應該動畫而不會殺死你的應用程序。
編輯 - 代碼示例
例如,添加一些資源以動畫(他們是矩形,因爲你不能直接動畫化的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。
我想你仍然可以使用'ObjectAnimationUsingKeyFrames'爲'Brushes'製作動畫? –