wpf 利用path路径实现流体管道动画的关闭,开始功能。
一、具体功能
利用path路径实现了流体动画,及其相关开始暂停按钮功能
二、代码
前台代码
<Window x:Class="ANIMATION.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:ANAMATION"
mc:Ignorable="d"
Title="MainWindow" Height="450" Width="800">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="115*"/>
<ColumnDefinition Width="149*"/>
</Grid.ColumnDefinitions>
<Grid Grid.ColumnSpan="2" Width="692" Height="399" Margin="0,0,0,0" Canvas.Left="10" Canvas.Top="10">
<Canvas x:Name="cvsMain">
<Image Name="picture1" Source="/image/picture2.png" Width="692" Height="399" Margin="0" Canvas.Left="10" Canvas.Top="9" Visibility="Visible"/>
<Image Name="picture2" Source="/image/picture1.png" Width="692" Height="399" Margin="0" Canvas.Left="10" Canvas.Top="10" Visibility="Collapsed"/>
<Label x:Name="bloke" Background="Pink" Foreground="Pink" Content="Label" Canvas.Left="133" Canvas.Top="121" Height="4" Width="11"/>
<Label Background="Pink" Foreground="Pink" Content="Label" Canvas.Left="442" Canvas.Top="95" Height="4" Width="11" RenderTransformOrigin="0.394,4.583"/>
<Path x:Name="path3" Margin="0,0,0,0" Data="M88,35 L289,35 289,66 450,66" Stroke="AliceBlue" StrokeThickness="5" StrokeLineJoin="Round" Height="37.668" Stretch="Fill" Width="365" Canvas.Left="88" Canvas.Top="32.166"></Path>
<Path x:Name="path4" Margin="0,0,0,0" Data="M138,35 L188,35 188,35 188,35" Stroke="Green" StrokeThickness="5" StrokeLineJoin="Round" Height="6.085" Stretch="Fill" Width="64" Canvas.Left="138.333" Canvas.Top="32.124"></Path>
<Path x:Name="path5" Margin="0,0,0,0" Data="M188,35 L238,35 238,35 238,35" Stroke="Yellow" StrokeThickness="5" StrokeLineJoin="Round" Height="6.085" Stretch="Fill" Width="64" Canvas.Left="185" Canvas.Top="32"></Path>
<Path x:Name="path6" Margin="0,0,0,0" Data="M238,35 L289,35 289,35 289,35" Stroke="Blue" StrokeThickness="5" StrokeLineJoin="Round" Height="6.085" Stretch="Fill" Width="49" Canvas.Left="249" Canvas.Top="32.166"></Path>
<Path x:Name="path10" Margin="0,0,0,0" Data="M289,35 L289,66 290,66 289,66" Stroke="Pink" StrokeThickness="5" StrokeLineJoin="Round" Height="6.085" Stretch="Fill" Width="49" Canvas.Left="265.667" Canvas.Top="51" RenderTransformOrigin="0.5,0.5">
<Path.RenderTransform>
<TransformGroup>
<ScaleTransform/>
<SkewTransform/>
<RotateTransform Angle="89.763"/>
<TranslateTransform/>
</TransformGroup>
</Path.RenderTransform>
</Path>
<Path x:Name="path11" Margin="0,0,0,0" Data="M289,100 L289,66 289,66 289,66" Stroke="Pink" StrokeThickness="5" StrokeLineJoin="Round" Height="6.085" Stretch="Fill" Width="49" Canvas.Left="271" Canvas.Top="76.333" RenderTransformOrigin="0.5,0.5">
<Path.RenderTransform>
<TransformGroup>
<ScaleTransform/>
<SkewTransform/>
<RotateTransform Angle="-89.488"/>
<TranslateTransform/>
</TransformGroup>
</Path.RenderTransform>
</Path>
<Path x:Name="path12" Margin="0,0,0,0" Data="M289,66 L339,66 339,66 339,66" Stroke="Orange" StrokeThickness="5" StrokeLineJoin="Round" Height="14.979" Stretch="Fill" Width="64.083" Canvas.Left="284.667" Canvas.Top="60.01"></Path>
<Path x:Name="path13" Margin="0,0,0,0" Data="M339,66 L348,66 389,66 389,66" Stroke="Purple" StrokeThickness="5" StrokeLineJoin="Round" Height="52.813" Stretch="Fill" Width="64.083" Canvas.Left="342.667" Canvas.Top="40.76"></Path>
<Path x:Name="path2" Margin="0,0,0,0" Data="M88,100 L289,100 289,66 450,66" Stroke="AliceBlue" StrokeThickness="5" StrokeLineJoin="Round" Height="35.958" Stretch="Fill" Width="364.75" Canvas.Left="88" Canvas.Top="65.021"></Path>
<Path x:Name="path7" Margin="0,0,0,0" Data="M138,100 L188,100 188,100 188,100" Stroke="Green" StrokeThickness="5" StrokeLineJoin="Round" Height="6.085" Stretch="Fill" Width="64" Canvas.Left="138" Canvas.Top="95"></Path>
<Path x:Name="path8" Margin="0,0,0,0" Data="M188,100 L238,100 238,100 238,100" Stroke="Yellow" StrokeThickness="5" StrokeLineJoin="Round" Height="6.085" Stretch="Fill" Width="64" Canvas.Left="185" Canvas.Top="94.894"></Path>
<Path x:Name="path9" Margin="0,0,0,0" Data="M238,100 L289,100 289,100 289,100" Stroke="Blue" StrokeThickness="5" StrokeLineJoin="Round" Height="6.085" Stretch="Fill" Width="49" Canvas.Left="249" Canvas.Top="95"></Path>
<Image Name="picture" Source="/image/kaiguan.png" Width="43" Height="25" Margin="0" Canvas.Left="435" Canvas.Top="85" Visibility="Visible" RenderTransformOrigin="0.494,0.495"/>
<Image x:Name="picture4" Source="/image/kaiguan.png" Width="29" Height="31" Margin="0" Canvas.Left="185" Canvas.Top="85" Visibility="Visible" RenderTransformOrigin="0.494,0.495"/>
<Image x:Name="picture5" Source="/image/kaiguan.png" Width="29" Height="31" Margin="0" Canvas.Left="185" Canvas.Top="22" Visibility="Visible" RenderTransformOrigin="0.494,0.495"/>
</Canvas>
</Grid>
<Button Content="打开" HorizontalAlignment="Left" Margin="191,9,0,0" VerticalAlignment="Top" Width="75" Click="Open_leader"/>
<Button Content="关闭" Click="Close_leader" HorizontalAlignment="Left" Margin="10,9,0,0" VerticalAlignment="Top" Width="77" Grid.Column="1" Height="19" />
</Grid>
</Window>
using System;
后台代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Timers;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Windows.Threading;
namespace ANIMATION
{
public partial class MainWindow : Window
{
Storyboard story = new Storyboard(); //实例化一个故事画板
bool onestop = false; //用于控制关闭功能
public MainWindow()
{
InitializeComponent();
}
/// <summary>
/// 动画实现函数
/// </summary>
/// <param name="cvs">画板</param>
/// <param name="path">动画路径</param>
/// <param name="targetWidth">动画对象</param>
/// <param name="duration">动画时间</param>
public void ButtonByPath(Canvas cvs, Path path, double targetWidth, int duration = 4) //实现动画函数
{
#region 创建动画对象
Rectangle target = new Rectangle();
target.Width = targetWidth;
target.Height = targetWidth;
target.Fill = new SolidColorBrush(Colors.Black);
cvs.Children.Add(target);
Canvas.SetLeft(target, -targetWidth / 2);
Canvas.SetTop(target, -targetWidth / 2);
target.RenderTransformOrigin = new Point(0.5, 0.5);
#endregion
MatrixTransform matrix = new MatrixTransform(); //旋转转换实例
TransformGroup groups = new TransformGroup(); //给图片空间一个转换的实例
groups.Children.Add(matrix);
target.RenderTransform = groups;
string registname = "matrix" + Guid.NewGuid().ToString().Replace("-", "");
this.RegisterName(registname, matrix);
MatrixAnimationUsingPath matrixAnimation = new MatrixAnimationUsingPath(); //实例化一个Double类型的动画
matrixAnimation.PathGeometry = PathGeometry.CreateFromGeometry(Geometry.Parse(path.Data.ToString())); //物体运动路线
matrixAnimation.Duration = new Duration(TimeSpan.FromSeconds(duration)); //播放时间长度为2秒
matrixAnimation.DoesRotateWithTangent = true; //跟随路径旋转
matrixAnimation.RepeatBehavior = RepeatBehavior.Forever; //循环播放
//Storyboard story = new Storyboard();
story.Children.Add(matrixAnimation); //将动画添加到动画板中
Storyboard.SetTargetName(matrixAnimation, registname);
Storyboard.SetTargetProperty(matrixAnimation, new PropertyPath(MatrixTransform.MatrixProperty)); //给动画指定依赖的属性
story.SpeedRatio = 5; //播放的数度
story.FillBehavior = FillBehavior.Stop;
story.Begin(target, true); //开始动画
//story.Pause(this);
Console.WriteLine(onestop);
if (onestop == true)
story.Remove(target); //停止动画
}
/// <summary>
/// 打开动画
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void Open_leader(object sender, RoutedEventArgs e) //打开动画
{
onestop = false;
//IsOnestop();
picture.Visibility = Visibility.Collapsed;
picture5.Visibility = Visibility.Collapsed;
picture4.Visibility = Visibility.Collapsed;
//ButtonByPath(cvsMain, path2, path2.StrokeThickness);
//ButtonByPath(cvsMain, path3, path3.StrokeThickness);
ButtonByPath(cvsMain, path4, path4.StrokeThickness);
ButtonByPath(cvsMain, path5, path5.StrokeThickness);
ButtonByPath(cvsMain, path6, path6.StrokeThickness);
ButtonByPath(cvsMain, path7, path7.StrokeThickness);
ButtonByPath(cvsMain, path8, path8.StrokeThickness);
ButtonByPath(cvsMain, path9, path9.StrokeThickness);
ButtonByPath(cvsMain, path10, path10.StrokeThickness);
ButtonByPath(cvsMain, path11, path11.StrokeThickness);
ButtonByPath(cvsMain, path12, path12.StrokeThickness);
ButtonByPath(cvsMain, path13, path13.StrokeThickness);
}
/// <summary>
/// 关闭动画
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void Close_leader(object sender, RoutedEventArgs e) //关闭动画
{
if (onestop == true)
{
onestop = false;
}
else
{
onestop = true;
//ButtonByPath(cvsMain, path2, path2.StrokeThickness);
ButtonByPath(cvsMain, path4, path4.StrokeThickness);
ButtonByPath(cvsMain, path5, path5.StrokeThickness);
ButtonByPath(cvsMain, path6, path6.StrokeThickness);
ButtonByPath(cvsMain, path7, path7.StrokeThickness);
ButtonByPath(cvsMain, path8, path8.StrokeThickness);
ButtonByPath(cvsMain, path9, path9.StrokeThickness);
ButtonByPath(cvsMain, path10, path10.StrokeThickness);
ButtonByPath(cvsMain, path11, path11.StrokeThickness);
ButtonByPath(cvsMain, path12, path12.StrokeThickness);
ButtonByPath(cvsMain, path13, path13.StrokeThickness);
//Console.WriteLine("这是啥" + stop12);
IsOnestop();
picture.Visibility = Visibility.Visible;
picture5.Visibility = Visibility.Visible;
picture4.Visibility = Visibility.Visible;
}
}
/// <summary>
/// 用于执行动画的画板更新操作控制
/// </summary>
/// <returns></returns>
public bool IsOnestop() //输出stop12用于控制开关
{
return onestop;
}
}
}