wpf 利用path路径实现流体管道动画的关闭,开始功能。

本文介绍了如何使用WPF的Path元素结合动画效果,实现流体管道的动态显示,并提供了开始和关闭动画的功能。通过设置Path的Data属性定义管道路径,结合Storyboard和Transforms进行动画控制,实现流畅的视觉效果。同时,文章包含了打开和关闭动画的代码实现,展示了如何根据按钮点击事件控制动画的启停。
摘要由CSDN通过智能技术生成

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;
        }
    }
}





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值