我想在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