WPF动画

往复改变控件大小

C# 复制代码
      // 用C#代码进行编写
      var widthAnimation = new DoubleAnimation()
      {
          Duration = new Duration(TimeSpan.FromSeconds(5)),
          RepeatBehavior = RepeatBehavior.Forever,
          AutoReverse=true,
          From = 100,
          To = 500
      };
      var heightAnimation = new DoubleAnimation()
      {
          Duration = new Duration(TimeSpan.FromSeconds(5)),
          RepeatBehavior = RepeatBehavior.Forever,
          AutoReverse = true,
          From = 100,
          To = 500
      };
      Storyboard storyboard = new Storyboard()
      {
          Children = new TimelineCollection()
          {
              widthAnimation,heightAnimation
          },
      };
      // 这个如果同时进行两个动画,会出现开始不同步
      // this.border.BeginAnimation(WidthProperty,widthAnimation);
      // 使用Storyboard可以保证多个动画同步进行
      Storyboard.SetTarget(widthAnimation, border);
      Storyboard.SetTargetProperty(widthAnimation, new PropertyPath("Width"));
      Storyboard.SetTarget(heightAnimation, border);
      Storyboard.SetTargetProperty(heightAnimation, new PropertyPath("Height"));
      storyboard.Begin();

用xaml实现

html 复制代码
        <Border
            Name="border"
            Width="100"
            Height="100"
            Background="pink">
            <Border.Style>
                <Style TargetType="Border">
                    <Style.Triggers>
                        <EventTrigger RoutedEvent="Loaded">
                            <BeginStoryboard>
                                <Storyboard>
                                    <DoubleAnimation
                                        AutoReverse="True"
                                        RepeatBehavior="Forever"
                                        Storyboard.TargetProperty="Width"
                                        From="100"
                                        To="500"
                                        Duration="0:0:5" />
                                    <DoubleAnimation
                                        AutoReverse="True"
                                        RepeatBehavior="Forever"
                                        Storyboard.TargetProperty="Height"
                                        From="100"
                                        To="500"
                                        Duration="0:0:5" />
                                </Storyboard>
                            </BeginStoryboard>
                        </EventTrigger>
                    </Style.Triggers>
                </Style>
            </Border.Style>
        </Border>

改变控件位置

  • 通过magin改变位置
html 复制代码
        <Border
            Name="border"
            Width="100"
            Height="100"
            Background="pink">
            <Border.Style>
                <Style TargetType="Border">
                    <Style.Triggers>
                        <EventTrigger RoutedEvent="Loaded">
                            <BeginStoryboard>
                                <Storyboard>
                                    <ThicknessAnimation
                                        AutoReverse="True"
                                        RepeatBehavior="Forever"
                                        Storyboard.TargetProperty="Margin"
                                        From="0,0,0,0"
                                        To="500,500,0,0"
                                        Duration="0:0:5" />
                                </Storyboard>
                            </BeginStoryboard>
                        </EventTrigger>
                    </Style.Triggers>
                </Style>
            </Border.Style>
        </Border>
  • 通过TranslateTransform改变位置
html 复制代码
        <Border
            Name="border"
            Width="100"
            Height="100"
            Background="pink">
            <Border.Style>
                <Style TargetType="Border">
                    <Style.Triggers>
                        <EventTrigger RoutedEvent="Loaded">
                            <BeginStoryboard>
                                <Storyboard>
                                    <DoubleAnimation
                                        AutoReverse="True"
                                        RepeatBehavior="Forever"
                                        Storyboard.TargetProperty="(Border.RenderTransform).(TranslateTransform.X)"
                                        From="0"
                                        To="500"
                                        Duration="0:0:5" />
                                    <DoubleAnimation
                                        AutoReverse="True"
                                        RepeatBehavior="Forever"
                                        Storyboard.TargetProperty="(Border.RenderTransform).(TranslateTransform.Y)"
                                        From="0"
                                        To="500"
                                        Duration="0:0:5" />
                                </Storyboard>
                            </BeginStoryboard>
                        </EventTrigger>
                    </Style.Triggers>
                </Style>
            </Border.Style>
            <Border.RenderTransform>
                <TranslateTransform X="0" Y="0" />
            </Border.RenderTransform>
        </Border>

改变控件背景色

html 复制代码
        <Border
            Name="border"
            Width="100"
            Height="100"
            Background="pink">
            <Border.Style>
                <Style TargetType="Border">
                    <Style.Triggers>
                        <EventTrigger RoutedEvent="Loaded">
                            <BeginStoryboard>
                                <Storyboard>
                                    <ColorAnimation
                                        AutoReverse="True"
                                        RepeatBehavior="Forever"
                                        Storyboard.TargetProperty="(Border.Background).(SolidColorBrush.Color)"
                                        From="Pink"
                                        To="Orange"
                                        Duration="0:0:3" />
                                </Storyboard>
                            </BeginStoryboard>
                        </EventTrigger>
                    </Style.Triggers>
                </Style>
            </Border.Style>
        </Border>

关键帧

关键帧动画(4大类)

类型 语法 介绍
线性变化关键帧 Linear+【类型名称】+KeyFrame 简单线性动画处理,如同y=kx+b
离散变化关键帧 Discrete+【类型名称】+KeyFrame 不连续变化,如同从A间隔一段时间直接变化到B
样条关键帧 Spline+【类型名称】+KeyFrame 样条函数(二次贝塞尔曲线-Path)
缓冲式关键帧 Easing+【类型名称】+KevFrame 使用简单动画时介绍的缓动效果,如同拨珠掉到地效果

线性变化关键帧应用:

html 复制代码
        <Border
            Name="border"
            Width="100"
            Height="100"
            Background="pink">
            <Border.Style>
                <Style TargetType="Border">
                    <Style.Triggers>
                        <EventTrigger RoutedEvent="Loaded">
                            <BeginStoryboard>
                                <Storyboard>
                                    <ColorAnimationUsingKeyFrames Storyboard.TargetProperty="Background.Color" Duration="0:0:5">
                                        <LinearColorKeyFrame KeyTime="0:0:0" Value="Pink" />
                                        <LinearColorKeyFrame KeyTime="0:0:3" Value="Orange" />
                                        <LinearColorKeyFrame KeyTime="0:0:5" Value="Red" />
                                    </ColorAnimationUsingKeyFrames>
                                </Storyboard>
                            </BeginStoryboard>
                        </EventTrigger>
                    </Style.Triggers>
                </Style>
            </Border.Style>
        </Border>

离散变化关键帧:

html 复制代码
        <Button
            Grid.Row="1"
            HorizontalAlignment="Stretch"
            Content="测试">
            <Button.Style>
                <Style TargetType="Button">
                    <Style.Triggers>
                        <EventTrigger RoutedEvent="Loaded">
                            <BeginStoryboard>
                                <Storyboard>
                                    <StringAnimationUsingKeyFrames Storyboard.TargetProperty="Content" Duration="0:0:5">
                                        <DiscreteStringKeyFrame KeyTime="0:0:1" Value="1" />
                                        <DiscreteStringKeyFrame KeyTime="0:0:2" Value="2" />
                                        <DiscreteStringKeyFrame KeyTime="0:0:3" Value="3" />
                                        <DiscreteStringKeyFrame KeyTime="0:0:4" Value="4" />
                                        <DiscreteStringKeyFrame KeyTime="0:0:5" Value="5" />
                                    </StringAnimationUsingKeyFrames>
                                </Storyboard>
                            </BeginStoryboard>
                        </EventTrigger>
                    </Style.Triggers>
                </Style>
            </Button.Style>
        </Button>

样条关键帧应用:

html 复制代码
        <StackPanel Orientation="Horizontal">
            <StackPanel.RenderTransform>
                <TranslateTransform X="0" Y="0" />
            </StackPanel.RenderTransform>
            <StackPanel.Style>
                <Style TargetType="StackPanel">
                    <Style.Triggers>
                        <EventTrigger RoutedEvent="Loaded">
                            <BeginStoryboard>
                                <Storyboard>

                                    <!--<DoubleAnimationUsingKeyFrames RepeatBehavior="Forever" Storyboard.TargetProperty="(StackPanel.RenderTransform).(TranslateTransform.X)">
                                        <SplineDoubleKeyFrame KeyTime="0:0:5" Value="1500">
                                            <SplineDoubleKeyFrame.KeySpline>
                                                <KeySpline ControlPoint1="0.1,0.9" ControlPoint2="0.9,0.1" />
                                            </SplineDoubleKeyFrame.KeySpline>
                                        </SplineDoubleKeyFrame>
                                    </DoubleAnimationUsingKeyFrames>-->

                                    <DoubleAnimationUsingKeyFrames RepeatBehavior="Forever" Storyboard.TargetProperty="(StackPanel.RenderTransform).(TranslateTransform.X)">
                                        <SplineDoubleKeyFrame
                                            KeySpline="0.1,0.9,0.9,0.1"
                                            KeyTime="0:0:5"
                                            Value="1500" />
                                    </DoubleAnimationUsingKeyFrames>
                                </Storyboard>
                            </BeginStoryboard>
                        </EventTrigger>
                    </Style.Triggers>
                </Style>
            </StackPanel.Style>
            <Ellipse
                Width="10"
                Height="10"
                Fill="pink" />
            <Ellipse
                Width="10"
                Height="10"
                Margin="10,0,0,0"
                Fill="pink" />
            <Ellipse
                Width="10"
                Height="10"
                Margin="10,0,0,0"
                Fill="pink" />
        </StackPanel>

缓冲式关键帧应用:

html 复制代码
        <StackPanel Orientation="Horizontal">
            <StackPanel.RenderTransform>
                <TranslateTransform X="0" Y="0" />
            </StackPanel.RenderTransform>
            <StackPanel.Style>
                <Style TargetType="StackPanel">
                    <Style.Triggers>
                        <EventTrigger RoutedEvent="Loaded">
                            <BeginStoryboard>
                                <Storyboard>
                                    <DoubleAnimationUsingKeyFrames RepeatBehavior="Forever" Storyboard.TargetProperty="(StackPanel.RenderTransform).(TranslateTransform.X)">
                                        <LinearDoubleKeyFrame KeyTime="0:0:3" Value="500" />
                                        <EasingDoubleKeyFrame KeyTime="0:0:6" Value="1500">
                                            <EasingDoubleKeyFrame.EasingFunction>
                                                <BounceEase EasingMode="EaseInOut" />
                                            </EasingDoubleKeyFrame.EasingFunction>
                                        </EasingDoubleKeyFrame>
                                    </DoubleAnimationUsingKeyFrames>
                                </Storyboard>
                            </BeginStoryboard>
                        </EventTrigger>
                    </Style.Triggers>
                </Style>
            </StackPanel.Style>
            <Ellipse
                Width="10"
                Height="10"
                Fill="pink" />
            <Ellipse
                Width="10"
                Height="10"
                Margin="10,0,0,0"
                Fill="pink" />
            <Ellipse
                Width="10"
                Height="10"
                Margin="10,0,0,0"
                Fill="pink" />
        </StackPanel>

路径动画

DoubleAnimationUsingPath路径动画:

  • 根据路径实现X、Y运动
html 复制代码
    <Canvas>
        <Ellipse
            Width="50"
            Height="50"
            Fill="pink">
            <Ellipse.RenderTransform>
                <TranslateTransform X="0" Y="0" />
            </Ellipse.RenderTransform>
            <Ellipse.Style>
                <Style TargetType="Ellipse">
                    <Style.Triggers>
                        <EventTrigger RoutedEvent="Loaded">
                            <BeginStoryboard>
                                <Storyboard>
                                    <DoubleAnimationUsingPath
                                        Source="X"
                                        Storyboard.TargetProperty="(Ellipse.RenderTransform).(TranslateTransform.X)"
                                        Duration="0:0:4">
                                        <DoubleAnimationUsingPath.PathGeometry>
                                            <PathGeometry Figures="M0 0 60,100 A100 50 0 0 1 400 150" />
                                        </DoubleAnimationUsingPath.PathGeometry>
                                    </DoubleAnimationUsingPath>
                                    <DoubleAnimationUsingPath
                                        Source="Y"
                                        Storyboard.TargetProperty="(Ellipse.RenderTransform).(TranslateTransform.Y)"
                                        Duration="0:0:4">
                                        <DoubleAnimationUsingPath.PathGeometry>
                                            <PathGeometry Figures="M0 0 60,100 A100 50 0 0 1 400 150" />
                                        </DoubleAnimationUsingPath.PathGeometry>
                                    </DoubleAnimationUsingPath>
                                </Storyboard>
                            </BeginStoryboard>
                        </EventTrigger>
                    </Style.Triggers>
                </Style>
            </Ellipse.Style>
        </Ellipse>
    </Canvas>
  • 根据路径实现X、Y、角度Angle运动
html 复制代码
<UserControl
    x:Class="Cell.Core.Views.LogView"
    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:hc="https://handyorg.github.io/handycontrol"
    xmlns:local="clr-namespace:Cell.Core.Views"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:prism="http://prismlibrary.com/"
    d:DesignHeight="450"
    d:DesignWidth="800"
    prism:ViewModelLocator.AutoWireViewModel="True"
    mc:Ignorable="d">
    <UserControl.Resources>
        <Storyboard x:Key="sb">
            <DoubleAnimationUsingPath
                Source="X"
                Storyboard.TargetName="tt"
                Storyboard.TargetProperty="X"
                Duration="0:0:4">
                <DoubleAnimationUsingPath.PathGeometry>
                    <PathGeometry Figures="M0 0 60,100 A100 50 0 0 1 400 150" />
                </DoubleAnimationUsingPath.PathGeometry>
            </DoubleAnimationUsingPath>
            <DoubleAnimationUsingPath
                Source="Y"
                Storyboard.TargetName="tt"
                Storyboard.TargetProperty="Y"
                Duration="0:0:4">
                <DoubleAnimationUsingPath.PathGeometry>
                    <PathGeometry Figures="M0 0 60,100 A100 50 0 0 1 400 150" />
                </DoubleAnimationUsingPath.PathGeometry>
            </DoubleAnimationUsingPath>
            <DoubleAnimationUsingPath
                Source="Angle"
                Storyboard.TargetName="rt"
                Storyboard.TargetProperty="Angle"
                Duration="0:0:4">
                <DoubleAnimationUsingPath.PathGeometry>
                    <PathGeometry Figures="M0 0 60,100 A100 50 0 0 1 400 150" />
                </DoubleAnimationUsingPath.PathGeometry>
            </DoubleAnimationUsingPath>
        </Storyboard>
    </UserControl.Resources>
    <UserControl.Triggers>
        <EventTrigger RoutedEvent="Button.Click" SourceName="btn">
            <BeginStoryboard Storyboard="{StaticResource sb}" />
        </EventTrigger>
    </UserControl.Triggers>
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="*" />
            <RowDefinition Height="Auto" />
        </Grid.RowDefinitions>
        <Border
            Width="50"
            Height="50"
            HorizontalAlignment="Left"
            VerticalAlignment="Top"
            Background="Pink">
            <Border.RenderTransform>
                <TransformGroup>
                    <RotateTransform x:Name="rt" Angle="0" />
                    <TranslateTransform x:Name="tt" X="0" Y="0" />
                </TransformGroup>
            </Border.RenderTransform>
        </Border>
        <Button Name="btn" Content="测试" />
    </Grid>
</UserControl>

PointAnimationUsingPath路径动画:

html 复制代码
<UserControl
    x:Class="Cell.Core.Views.LogView"
    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:hc="https://handyorg.github.io/handycontrol"
    xmlns:local="clr-namespace:Cell.Core.Views"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:prism="http://prismlibrary.com/"
    d:DesignHeight="450"
    d:DesignWidth="800"
    prism:ViewModelLocator.AutoWireViewModel="True"
    mc:Ignorable="d">
    <UserControl.Resources>
        <Storyboard x:Key="sb">
            <PointAnimationUsingPath
                Storyboard.TargetName="eg"
                Storyboard.TargetProperty="Center"
                Duration="0:0:4">
                <PointAnimationUsingPath.PathGeometry>
                    <PathGeometry Figures="M0 0 60,100 A100 50 0 0 1 400 150" />
                </PointAnimationUsingPath.PathGeometry>
            </PointAnimationUsingPath>
        </Storyboard>
    </UserControl.Resources>
    <UserControl.Triggers>
        <EventTrigger RoutedEvent="Button.Click" SourceName="btn">
            <BeginStoryboard Storyboard="{StaticResource sb}" />
        </EventTrigger>
    </UserControl.Triggers>
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="*" />
            <RowDefinition Height="Auto" />
        </Grid.RowDefinitions>
        <Path Fill="pink">
            <Path.Data>
                <EllipseGeometry
                    x:Name="eg"
                    Center="0,0"
                    RadiusX="40"
                    RadiusY="40" />
            </Path.Data>
        </Path>
        <Button Name="btn" Content="测试" />
    </Grid>
</UserControl>

MatrixAnimationUsingPath动画路径:

html 复制代码
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="*" />
            <RowDefinition Height="Auto" />
        </Grid.RowDefinitions>
        <Border
            Width="100"
            Height="50"
            HorizontalAlignment="Left"
            VerticalAlignment="Top"
            Background="Pink">
            <Border.RenderTransform>
                <MatrixTransform />
            </Border.RenderTransform>
            <Border.Style>
                <Style TargetType="Border">
                    <Style.Triggers>
                        <EventTrigger RoutedEvent="Loaded">
                            <BeginStoryboard>
                                <Storyboard>
                                    <MatrixAnimationUsingPath DoesRotateWithTangent="True" Storyboard.TargetProperty="(Border.RenderTransform).(MatrixTransform.Matrix)">
                                        <MatrixAnimationUsingPath.PathGeometry>
                                            <PathGeometry Figures="M0 0 60,100 A100 50 0 0 1 400 150" />
                                        </MatrixAnimationUsingPath.PathGeometry>
                                    </MatrixAnimationUsingPath>
                                </Storyboard>
                            </BeginStoryboard>
                        </EventTrigger>
                    </Style.Triggers>
                </Style>
            </Border.Style>
        </Border>
    </Grid>
  • 动画辅助属性
SpeedRatio 播放速度
AccelerationRatio 加速速率
DecelerationRatio 减速速率
AutoReverse 是否执行相反的动画
FillBehavior 动画结束状态:HoldEnd、Stop
RepeatBehavior 动画重复方式,包括三种值:Forever、次数(2x)、时间
lsAddtive 将目标属性的当前值添加到动画的起始值
IsCumulative 如果动画不断重复,就累积动画值
BeginTime 动画线启动等待时长
EasinaFunction 动画缓动属性
相关推荐
FuckPatience2 天前
WPF 给一个界面上的按钮应用同一种样式
wpf
Polevne3 天前
WPF\MAUI\Avalonia Dispatcher
wpf
Ares-Wang3 天前
wpf 图表制作 LiveCharts
wpf
A_nanda4 天前
c#WPF开发常见问题
开发语言·c#·wpf
Wang's Blog6 天前
AI Agent白手起家60: 多智能体架构解析与 LangGraph 入门
人工智能·架构·wpf
.Peter6 天前
.NET/WPF 程序在部分 Windows 电脑无法保存用户环境变量:使用 DPAPI 实现安全兼容
windows·信息安全·c#·.net·wpf·环境变量·dpapi
dalong107 天前
WPF:3D型材模型
3d·wpf
一念春风7 天前
文件透明加密(C、C#)
c语言·c#·wpf
yanaiding9 天前
C# WPF 独立开发看图工具 PixSight 经验介绍(二)—— 水印模块开发实录
图像处理·c#·wpf·个人开发