使用其他UI元素时动画滞后

时间:2014-01-20 13:47:56

标签: c# wpf

在表格上放置一条线,以每10秒1转的低速旋转。当我运行时,应用程序动画是好的。但是当我使用界面的任何其他元素(单击按钮文本框)时,绘制一条线开始滞后。可能是什么问题呢?

我正在制造雷达。线应高精度旋转。我应该知道处理碰撞的直线角度。

我使用计时器

  int razvlineAngle = 0;
  RotateTransform rotateTransform1 = new RotateTransform(0, 384, 384);

 private void ShowTick()
    {

            razvlineAngle++;
            rotateTransform1.Angle = razvlineAngle;
            razvline.RenderTransform = rotateTransform1; 

}

1 个答案:

答案 0 :(得分:0)

您可以使用DoubleAnimation和RotateTransform轻松旋转纯XAML中的线条,例如:

<Canvas>
   <Line X1="0" Y1="0" X2="300"  Y2="100"  Fill="Black" StrokeThickness="4" Stroke="Black"     OpacityMask="Black"  >
        <Line.RenderTransform>
            <RotateTransform CenterX="150" CenterY="50"/>
        </Line.RenderTransform>
        <Line.Triggers>
            <EventTrigger RoutedEvent="Loaded">
                <BeginStoryboard>
                    <Storyboard>
                        <DoubleAnimation Storyboard.TargetProperty="(Line.RenderTransform).(RotateTransform.Angle)" 
                                         To="-360" 
                                         Duration="0:0:1" 
                                         RepeatBehavior="Forever"/>
                    </Storyboard>
                </BeginStoryboard>
            </EventTrigger>
        </Line.Triggers>
    </Line>
</Canvas>

这不需要任何计时器。 DoubleAnimation在To指定的时间跨度内将其目标属性从其原始值更改为Duration

您可以通过代码实现相同的效果。在这种情况下,Line XAML就是:

    <Line x:Name="MyLine"  X1="0" Y1="0" X2="300"  Y2="100"  Fill="Black" StrokeThickness="4" Stroke="Black" OpacityMask="Black"  />

和代码:

    public MainWindow()
    {
        InitializeComponent();

        var animation = new DoubleAnimation(0, -360, new Duration(TimeSpan.FromSeconds(1)))
        {
            RepeatBehavior = RepeatBehavior.Forever
        };

        var transform = new RotateTransform(0,150,50);
        MyLine.RenderTransform=transform;

        transform.BeginAnimation(RotateTransform.AngleProperty, animation);
    }

您不需要计时器,因为DoubleAnimation提供计时。您也不需要创建新的RotateTransform,也不需要为每个步骤设置行的RenderTransform。对变换的Angle属性的更改会自动导致行渲染

请注意,转换发生在UI线程上。如果对按钮事件执行繁重处理,则动画仍然是块状的。解决此问题的方法是在后台执行繁重的处理,例如使用任务或后台线程