我做了一个动画来旋转我的控制,但是当它变成trigert时它只是跳到最终位置然后立即返回到起始位置。
控件由后面的代码构成,并且是具有以下属性的TextBoxes:
FontSize = 45;
TextAlignment = TextAlignment.Center;
Widh = 40;
Heigh = 45;
我将TextBox存储在数组中,因此我使用以下代码触发动画:
foreach (TextBlock b in arrayOfTextBoxes)
{
Rotate(b);
}
动画:
public static void Rotate(UIElement target)
{
var projection = new PlaneProjection();
target.Projection = projection;
DoubleAnimation da = new DoubleAnimation();
da.From = 0;
da.To = 90;
da.Duration = TimeSpan.FromSeconds(0.25);
da.AutoReverse = false;
Storyboard.SetTargetProperty(da, new PropertyPath(PlaneProjection.RotationZProperty));
Storyboard.SetTarget(da, projection);
Storyboard sb = new Storyboard();
sb.Children.Add(da);
EventHandler eh = null;
eh = (s, args) =>
{
projection.RotationZ = 90;
sb.Stop();
sb.Completed -= eh;
};
sb.Completed += eh;
sb.Begin();
}
编辑:现在我可以知道问题是什么。我每秒都有一个(有时两个)Dispatcher Times在后台滴答作响。当我禁用它们时,问题就消失了。但我无法做到,因为我需要它们来衡量时间。
在我触发动画之前对它们进行限制并再次启动它们确实没有帮助。
// DispetcherTimers执行此操作:
void tikac_Tick(object sender, EventArgs e)
{
herniCas += new TimeSpan(0, 0, 1);
}
击> <击> 撞击>
答案 0 :(得分:2)
动画故事板通常会保留最后一个值“直到它们被停止”。它们不会永久更改实际的属性值。他们只是改变它当前渲染的值(不是依赖属性很好吗?:))
当它在结束时明确地停止它时,值将恢复为其原始值。如果您希望值保持更改,请不要停止故事板,或者在动画更改时在代码中明确设置它。
你的例子中的动画是如此之快,它只是很快结束(故事板的启动时间可以是几帧,其间的任何时间都被跳过,因为动画是固定时间插值,而不是帧特定的。)