在表格上放置一条线,以每10秒1转的低速旋转。当我运行时,应用程序动画是好的。但是当我使用界面的任何其他元素(单击按钮文本框)时,绘制一条线开始滞后。可能是什么问题呢?
我正在制造雷达。线应高精度旋转。我应该知道处理碰撞的直线角度。
我使用计时器
int razvlineAngle = 0;
RotateTransform rotateTransform1 = new RotateTransform(0, 384, 384);
private void ShowTick()
{
razvlineAngle++;
rotateTransform1.Angle = razvlineAngle;
razvline.RenderTransform = rotateTransform1;
}
答案 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线程上。如果对按钮事件执行繁重处理,则动画仍然是块状的。解决此问题的方法是在后台执行繁重的处理,例如使用任务或后台线程