我想在WPF中創建一個閃亮的加載微調器。它應該在圓圈中有圓圈,並且它應該旋轉,在處理某些數據時給用戶看看的東西。附圖。您可能會注意到實際結果質量稍差。這是因爲無論我嘗試做什麼,微調器都需要大約5到7%的CPU。這是我不能接受的,因爲......好吧,這是一個微調。它在計算機忙着做某事的時候出現了,我坦率地希望它能儘早做到這一點。在WPF中創建一個簡單的加載動畫的性能問題
http://image.bayimg.com/babieaadh.jpg
好了,所以該XAML代碼定義了兩個嵌套的格像這樣:
<Grid
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
x:Class="WPFTest.Spinner"
Name="View" Width="40" Height="40">
<Grid Name="Grid" Width="40" Height="40" >
<Grid.CacheMode>
<BitmapCache EnableClearType="False" RenderAtScale="1" SnapsToDevicePixels="False"/>
</Grid.CacheMode>
</Grid>
</Grid>
的其餘部分是在代碼隱藏,基本上添加幾個橢圓和設置動畫。
首先我的方法創建橢圓:
private static Ellipse GetEllipse(double x, double y, double opacity)
{
return new Ellipse
{
Fill = new SolidColorBrush(Colors.White),
Width = Size,
Height = Size,
Margin = new Thickness(x, y, 0, 0),
Opacity = opacity
};
}
微調構造
public Spinner()
{
InitializeComponent();
const double step = 2 * Math.PI/Count; //Cound is const = 8
const double r = 1.4 * Field; //Field is const = 40
double angle = 0;
for (var i = 0; i < Count; i++)
{
Grid.Children.Add(GetEllipse(r * Math.Cos(angle), r * Math.Sin(angle), 1 - i/(double) Count));
angle += step;
}
_doubleAnimation = new DoubleAnimation(0, 360, new Duration(new TimeSpan(0, 0, 1)))
{
RepeatBehavior = RepeatBehavior.Forever,
};
Grid.RenderTransform = new RotateTransform(0, Field, Field);
RenderOptions.SetBitmapScalingMode(this, BitmapScalingMode.NearestNeighbor); //Low quality!
Grid.RenderTransform.BeginAnimation(RotateTransform.AngleProperty, _doubleAnimation);
}
現在,這一切的基本工作原理,當你刪除設置一切低質量線路,它甚至還挺漂亮。但它最終沒用。如果我加載了一些東西,並且這個微調器佔用了我CPU的5-7%,那麼這對我來說是個問題。當然,多核......無論如何。不,這應該工作! :)
我的下一個最好的想法是解決這個問題,而不是旋轉微調器,只是在一段時間後重置每個橢圓的顏色。我會盡最大努力,但同時知道發生了什麼,以及爲什麼這麼簡單的動畫會永遠存在,這將是非常有趣的。此外,如果有一個「MakeAnimationWorkBetter」屬性我沒有設置,我將非常有義務找出在哪裏以及如何...
在此先感謝。
非常感謝您科林,這走近就像一個魅力的工作。另一方面,單個橢圓的動畫不透明度消耗盡可能多的CPU。 – Gleno 2010-12-17 01:58:41