原文:
在WPF中可以使用Animation来完成动画功能,如移动,旋转等,最近写的一个程序需要实现控件的移动,包括自动移动和手动控制。原理很简单,就是改变控件的Margin属性。自动移动就是通过一个ThicknessAnimation的From 和To属性来控制Margin
Storyboard sbQue = new Storyboard();ThicknessAnimation ta = new ThicknessAnimation();ta.From = new Thickness(0,0,0,0);ta.To = new Thickness(100,100,0,0);ta.Duration = TimeSpan.FromMilliseconds(3000);Storyboard.SetTarget(ta,Grid1)Storyboard.SetTargetProperty(ta, new PropertyPath("(Grid.Margin)"));sbQue.Children.Add(ta);sbQue.Begin();手动就是直接修改Margin属性。
Grid1.Margin = new Thickness(Grid1.Margin.Left-1,Grid1.Margin.Top,0,0) //向左移动一个像素
但是我发现一个问题:当用动画控制控件移动后,便无法再使用手动方式修改控件的Margin。原因是没有设置Storyboard的FillBehavior 属性。
FillBehavior 枚举如下,默认是HoldEnd,即动画结束后,继续重写动画目标属性,所有通过其他方法设置目标属性的值不起任何作用
如果想在动画停止后更改控件的属性,需要把FillBehavior属性设置为Stop,但是又会出现一个问题,控件的属性会恢复初始值,比如一个动画把Margin.Left的属性从0变为100,当动画开始后,控件的位置会移动,但是动画结束后,Margin.Left属性又恢复到了0,控件又回到了初始位置。
想要控件在动画结束后停留在原位,还需好设置Storyboard的Completed事件。
Storyboard sbQue = new Storyboard();ThicknessAnimation ta = new ThicknessAnimation();ta.From = new Thickness(0,0,0,0);ta.To = new Thickness(100,100,0,0); //从(0,0,0,0)移动到(100,100,0,0)ta.Duration = TimeSpan.FromMilliseconds(3000);Storyboard.SetTarget(ta,Grid1)Storyboard.SetTargetProperty(ta, new PropertyPath("(Grid.Margin)")); //把动画设置到Grid的Margin属性sbQue.Children.Add(ta);sbQue.FillBehavior = FillBehavior.Stop;sbQue.Completed+= SbQueOnCompleted; //设置动画结束后的事件sbQue.Begin();
private void SbQueOnCompleted(object sender, EventArgs eventArgs){ Grid1.Margin = new Thickness(100,100, 0, 0); //d控件停留在当前位置}
posted on 2019-01-15 17:10 阅读( ...) 评论( ...)