WPF动画结束后的行为方式

13 篇文章 0 订阅
10 篇文章 0 订阅

在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控件停留在当前位置
}



要实现WPF的三维动画,可以使用WPF的3D功能和动画功能结合起来。下面是一个示例代码,演示了如何在WPF中创建一个简单的三维动画: ```xaml <Window x:Class="Wpf3DAnimation.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="WPF 3D Animation" Height="450" Width="800"> <Grid> <Viewport3D> <Viewport3D.Camera> <PerspectiveCamera Position="0, 0, 5" LookDirection="0, 0, -1" UpDirection="0, 1, 0" /> </Viewport3D.Camera> <ModelVisual3D> <ModelVisual3D.Content> <Model3DGroup> <GeometryModel3D> <GeometryModel3D.Geometry> <MeshGeometry3D Positions="-1,-1,0 1,-1,0 -1,1,0 1,1,0" TriangleIndices="0 1 2 1 3 2" /> </GeometryModel3D.Geometry> <GeometryModel3D.Material> <DiffuseMaterial Brush="Red" /> </GeometryModel3D.Material> </GeometryModel3D> </Model3DGroup> </ModelVisual3D.Content> </ModelVisual3D> <Viewport3D.Triggers> <EventTrigger RoutedEvent="Viewport3D.Loaded"> <BeginStoryboard> <Storyboard> <Rotation3DAnimation From="0,0,0" To="0,360,0" Duration="0:0:5" RepeatBehavior="Forever"> <Rotation3DAnimation.By> <AxisAngleRotation3D Axis="0,1,0" Angle="1" /> </Rotation3DAnimation.By> </Rotation3DAnimation> </Storyboard> </BeginStoryboard> </EventTrigger> </Viewport3D.Triggers> </Viewport3D> </Grid> </Window> ``` 这个示例中,我们创建了一个窗口,并在窗口中添加了一个Viewport3D元素。Viewport3D是用于显示3D内容的容器。我们在Viewport3D中添加了一个PerspectiveCamera元素作为相机,用于定义观察场景的位置和方向。 然后,我们创建了一个ModelVisual3D元素,并将其添加到Viewport3D中。ModelVisual3D用于包含3D模型的可视化内容。在这个示例中,我们创建了一个GeometryModel3D元素,并将其添加到ModelVisual3D的Content属性中。GeometryModel3D用于定义3D模型的几何形状和材质。 在GeometryModel3D中,我们使用MeshGeometry3D定义了一个简单的四边形,并使用DiffuseMaterial定义了材质为红色。 最后,我们在Viewport3D的Triggers中添加了一个EventTrigger,当Viewport3D加载完成时触发。在触发器中,我们创建了一个Storyboard,并在其中添加了一个Rotation3DAnimation,用于对模型进行旋转动画。通过设置From和To属性,我们定义了旋转的起始角度和结束角度。通过设置By属性,我们定义了旋转的增量。通过设置Duration属性,我们定义了动画的持续时间。通过设置RepeatBehavior属性,我们定义了动画的重复行为。 这样,当窗口加载完成时,模型就会开始旋转动画
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值