精华内容
下载资源
问答
  • wpf工程中安装配置TeeChartT控件来进行编码的,,引用TeeChart的类,再在wpf的窗体编辑布局界面,即.xaml文件下通过标签导入TeeChart来实现对TeeChart的引用。
  • wpf动画

    2021-09-17 16:18:29
    WPF动画 1、 基本动画。 WPF提供了一个更高级的模型,通过该模型可以只关注动画的定义,而不考虑它们的渲 染方式,这个模型基于依赖项属性基础架构,本质上,WPF动画只不过是在一段时间间 隔内修改依赖项属性值的一...

    WPF动画
    1、 基本动画。 WPF提供了一个更高级的模型,通过该模型可以只关注动画的定义,而不考虑它们的渲 染方式,这个模型基于依赖项属性基础架构,本质上,WPF动画只不过是在一段时间间 隔内修改依赖项属性值的一种方式。不过还有另外一个限制,为了实现属性的动态化, 需要有支持相应数据类型的动画类,例如Button.Width属性使用双精度数据类型,为实现 属性的动态化,需要使用DoubleAnimation类,但Button.Padding属性使用的是 Thickness结构,所以需要使用ThicknessAnimation类。为了为属性应用动画,可以针对 相应的数据类型创建自己的动画类,你将发现,System.Windows.Media.Animation名称 空间已经为希望使用的大多数数据类型提供了动画类。
    2、 Animation类。 System.Windows.Media.Animation名称空间中将发现以下内容: 7个 “类型名+Animation类” 这些类使用插值动画。 22个 “类型名+AnimationUsingKeyFrames” 这些类使用关键帧动画。 3个 "类型名+AnimationUsingPath"类这类使用基于路径的动画。
    3、 使用C#代码创建动画。 wpf中,最常用的动画技术是线性插值动画,标准的帧速率是60秒/帧,使用动画的最简 单方式是实例化在前面列出的其中一个动画类,然后使用修改元素的BeginAnimation()方 法,所有wpf元素,从UIElement基类开始,都继承了BeginAnimation()方法,该方法是 IAnimatable接口的一部分。其中, From属性是元素的开始值,To属性是元素属性的结束值,Duration是整个动画执 行的时间。即使不使用To属性,也可以使用By属性,By值被简单地增加到From值上,使 其达到To值。不过,对于非数值数据类型来说,By属性是没有意义的。
    在这里插入图片描述
    在这里插入图片描述

    5、动画的生命周期。 从技术的角度看,WPF动画只是暂时的,这意味着它们不能真正改变基本属性的值, 当动画处于活动状态时,只是覆盖了属性的值。 单向动画,在动画运行结束后会保持处于活动状态,这是因为动画需要将按钮的宽度保 持为新值,这会导致如下常见问题,如果尝试使用代码在动画完成后修改属性值,代码 将不会起作用,因为代码只是为属性指定了一个新的本地值,但仍会先试用动画之后的 属性值。 为了解决动画完成后能修改属性的值,有以下方法可解决。
    (1)、设置AutoReverse属性,如果将该属性设置为true,将会反向运动,返回原始 的值(不适合动画完成后,再为属性设置最后的值,只是还原为动画之前的值)。
    (2)、改变FillBehavior属性。通常,FillBehavior属性设置为HoldEnd,这意味着当动 画结束时,会继续为目标元素应用最后的值。如果将FillBehavior属性改为Stop,只要动 画结束,属性就会恢复为原来的值(适用于动画结束后,再次为其设置新值,一般不与 AutoReverse配合着使用,这两个用其中一个就行了)。

    展开全文
  • C#WPFXAML动画

    2021-10-11 18:17:11
    C#WPF XAML 动画 一、动画(Animatuon) I.WPF三种动画: 1.(1)线性插值:在开始值和结束值之间以逐步增加的方式改变属性的动画(线性插值过程)。 (2)、关键帧:从一个值突然变成另一值的动画(关键帧动画)。所有关键...

    C#WPF XAML 动画

    一、动画(Animatuon)
    I.WPF三种动画:
    1.(1)线性插值:在开始值和结束值之间以逐步增加的方式改变属性的动画(线性插值过程)。
    (2)、关键帧:从一个值突然变成另一值的动画(关键帧动画)。所有关键帧动画都使用"类型名 + AnimationUsingKeyFrames " 的形式进行命名,比如StringAnimationUsingKeyFrames和ObjectAnimationUsingKeyFrames。
    (3)、路径:在System.Windows.Media.Animation名称空间中将发现以下内容:
    7个 “类型名+Animation类” 这些类使用插值动画。
    22个 “类型名+AnimationUsingKeyFrames” 这些类使用关键帧动画。
    3个 "类型名+AnimationUsingPath"类这类使用基于路径的动画。
    (4)、在项目引用“System.Xml”中双击,通过搜索System.Windows.Media.Animation名称空间找到“ColorAnimation”(关键帧动画)和“ColorAnimationUsingKeyFrames(颜色插值动画)”
    在这里插入图片描述
    (5)、某些数据类型有关键帧动画类,但没有插值动画类。例如,可使用关键帧为字符串应用动画,不能使用插值为字符串应用动画。然而,所有数据类型都支持关键帧动画,除非
    他们根本不支持动画。
    (6)、所有具有(使用插值)常规动画类的数据类型,也都有相应的关键帧动画的动画类型,如线性插值的DoubleAnimation对应DoubleAnimationUsingKeyFrames。另外还有一种基于
    路径的动画。
    (7)、有关键帧动画的未必有线性插值,有线性插值动画的一定有关键帧动画。
    2.动画创建
    (1)、创建 DoubleAnimation 使元素淡入和淡出的一种方法是对其属性进行动画处理 Opacity 。 由于 Opacity 属性的类型为 Double ,因此需要一个生成双精度值的动画。 DoubleAnimation是一种动画。
    (2)、定义动画:TargetName指定操作控件,TargetProperty指定操作控件的具体属性, From指定开始值,To指定结束值,Duration指定所需时间。
    在这里插入图片描述
    3.故事板
    (1)、若要将动画应用于对象,需要创建 Storyboard (故事板):是动画的基本单元,控制动画的播放、暂停、停止等操作,并使用 TargetName 和 TargetProperty 附加属性指定要进行动画处理的对象和属性,动画类型声明过后,需要使用EventTrigger(事件触发器)触发。
    4.事件触发器(将演示图板与触发器关联)
    (1)、通过事件触发器播放BeginStoryboard故事板的动画效果。
    (2)、Duration :起始值到目标值需要时间5秒,AutoReverse=“True”:使元素消失后变为视野RepeatBehavior=“Forever”: 使动画无限重复。
    II.线性插值动画
    1.两个属性:
    (1)、DoubleAnimatuin:属于Double类型的属性都可以使用它产生学习插值动画效果。
    (2)、ColorAnimatuin:作用于属性为Color类型对象的线性操作动画,用于改变对象的填充颜色。
    2.四个线性插值动画对象属性:
    (1)、From:动画从From属性指定的值继续到正在进行动画处理的属性基值或前一动画的输出值,具体取决于前一动画的配置方式。
    (2)、To:动画从进行动画处理的属性基值或前一动画的输出值继续到To属性指定的值。
    (3)、By:动画从正在进行动画处理的属性基值或前一动画的输出值继续到该值与By属性指定的值之和。
    (4)、Duration:动画执行一次持续的时间长度,Duration的格式为时:分:秒。
    3.五个动画播放控制属性:
    (1)、BeginTime:动画开始时间,默认的单位是天,也可以指定为时:分:秒。
    (2)、RepeatBehavior:用来声明动画重复次数,支持3种类型值:重复次数(格式–次数+X);一个时间段(格式-时:分:秒);特殊值Forever(代表无限循环)。
    (3)、AutoReverse:指定动画结束后是否向后继续播放,默认只为false,若设置为true,动画结束时会回到起始位置。
    (4)、SpeedRatio:用来增加或减小动画的速度,默认值为1,若增加它,动画产生加速播放的效果。
    (5)、FillBehavior:决定什么时候发生动画,什么时候结束,默认值为HoldEnd,表示动画结束后保持当前值不变,也可以设置为Stop,表示动画结束时属性再次回到起始值。
    4.动画的生命周期。
    从技术的角度看,WPF动画只是暂时的,这意味着它们不能真正改变基本属性的值,
    当动画处于活动状态时,只是覆盖了属性的值,单向动画,在动画运行结束后会保持处于活动状态,这是因为动画需要将按钮的宽度保持为新值,这会导致如下常见问题,如果尝试使用代码在动画完成后修改属性值,代码将不会起作用,因为代码只是为属性指定了一个新的本地值,但仍会先试用动画之后的属性值,为了解决动画完成后能修改属性的值,有以下两个属性解决。
    (1)、“AutoReverse”默认为false在false值的时候动画会在执行完后重新回到起点继续执行,如果设置为true值时动画在执行完后倒退执行动画(缓慢)。
    (2)、“FillBehavior”决定什么时候发生动画,什么时候结束,默认值为HoldEnd,表示动画结束后保持当前值不变,也可以设置为Stop,表示动画结束时属性再次回到起始值(瞬间)。
    (3)、“BeginTime”值设置动画在几秒后才执行,“RepeatBehavior”如果设置为具体的整数值的时候就是循环多少遍,如果是一个时间段时:份:秒的时候如0:0:2的时候就是执行两秒就停止,“SpeedRatio”数值为整数时表示为动画执行的速度。
    在这里插入图片描述
    III、关键帧动画
    1.关键帧动画:关键帧动画根据目标属性值之间的差异产生各种动画效果,一个关键帧动画可以在任意多个的目标属性值之间进行渐变,关键帧动画可以产生更复杂的动画效果。
    (1)、关键帧2个元素:DoubleAnimationUsingKeyFrames(Double关键帧动画)、ColorAnimationUsingKeyFrames(Color关键帧动画)。
    (2)、DoubleAnimationUsingKeyFrames(Double关键帧动画),动画效果为矩形向右一帧一帧的移动,没有过渡的过程。
    在这里插入图片描述
    (3)、ColorAnimationUsingKeyFrames(Color关键帧动画),动画效果为颜色以一帧一帧的方式进行变换,没有过渡的过程。
    在这里插入图片描述
    (4)、From属性是元素的开始值,To属性是元素属性的结束值,Duration是整个动画执
    行的时间。即使不使用To属性,也可以使用By属性,By值被简单地增加到From值上,使
    其达到To值。不过,对于非数值数据类型来说,By属性是没有意义的。
    (5)、 doubleAnimation.To = 250;是总数, doubleAnimation.By = 70;是前面按钮的值加(150 + 70 = 220)。
    在这里插入图片描述
    线性动画 :ColorAnimation、 DoubleAnimation、 PointAnimation ,它们均继承自 Timeline 。
    关键帧动画 : ColorAnimationUsingKeyFrames、 DoubleAnimationUsingKeyFrames、
    PointAnimationUsingKeyFrames、 ObjectAnimationUsingKeyFrames 。
    2.动画的Completed事件
    (1)、使用Completed事件时,要将事件设置BeginAnimation()方法之前,否则不起作用。在Completed中,可通过调用BeginAnimation()方法来渲染不活动的动画,为此,只需要
    指定属性,并为动画对象传递null引用。
    IV、TimeLine类
    1.TimeLine类的常用属性
    (1)、BeginTime 设置将被添加到动画开始之前的延时时间(TimeSpan类型),这一延时总被加载到总时间,具有5秒延时的5秒动画,总时间是10秒。
    (2)、Duration 动画开始到结束的运行时间。
    (3)、SpeedRatio 提高或减慢动画速度。SpeedRatio属性值是1,如果增加该属性值为5,动画的速度就会变成原来的5倍。
    (4)、AcclerationRatio 、DecelerationRatio 使动画不是线性的,从而开始时较慢,或者开始时较快,这两个属性的值都在0~1之间,这两个属性值之和不能超过1。
    (5)、AutoReverse 如果为true,当动画完成时会自动反向播放,返回到原始值。
    (6)、FillBehavior 决定当动画结束时,如何操作。
    (7)、RepeatBehavior 通过该属性,可以使用指定的次数或时间间隔重复动画,用于设置这个属性的RepeatBehavior对象决定了确切的行为。
    2.AccelerationRatio和DeceleRation属性
    (1)、可以通过AcclerationRation和DecelerationRation属性压缩部分时间轴,使动画运行的更快,并将拉伸其他时间进行补偿,使总时间保持不变。这两个属性都表示百分比值,例如,将AcceleRation属性设置为0.3,表示希望使用动画持续时间中前30%的时间进行加
    速。例如在1个10秒的动画中,前3秒会加速运行,而剩余的7秒会以恒定不变的速度运
    行,如果将DeceleRation属性设置为0.3,那么最后3秒回减速运行。
    在这里插入图片描述
    V、故事板、事件触发器
    1.故事板:
    故事板是增强的时间线,可用来分组多个动画,而且具有控制动画播放的能力—暂停、
    停止以及播放位置。然而Storyboard类提供的最基本功能是,能够使用TargetProperty
    和TargetName属性指向某个特定属性和特定元素,换句话说,故事板在动画和希望应
    用动画的属性之间架起了一座桥梁。其中TargetProperty属性和TargetName属性都是
    附加属性,故事板是BeginAnimation()方法的XAML等价物,通过故事板将动画指定到
    合适的元素和属性。
    (1)、上面一个故事板只能操作一个样式,而下面DoubleAnimation类可以操作多个样式。
    (2)、同步的动画:StoryBoard类间接地继承自TimeLineGroup类,所以StoryBoard类能包含多个动画,这些动画可以作为一组进行管理,这意味着它们可以在同一时间开始。
    在这里插入图片描述
    2.事件触发器
    可以在以下4个位置定义事件触发器。
    (1)、在样式中(Style.Triggers集合)。
    (2)、在数据模板中(DataTemplate.Triggers集合)。
    (3)、在控件模板中(ControlTemplate.Triggers集合)。
    (4)、直接在元素中定义事件触发器(FrameworkElement.Triggers集合)。
    在这里插入图片描述
    (5)、当创建事件触发器时,需要指定开始触发器的路由事件和触发器执行的一个或多个动作,对于动画,最常用的动作是BeginStoryboard,该动作相当于调用BeginAnimation()
    方法,所有事件触发器都可以启动动作,所有动作都由继承System.Windows.TriggerAction的类表示。
    3.使用样式关联触发器
    (1)、有三种基本类型的WPF触发器:属性触发器、数据触发器以及事件触发器。使用触发器是关联动画的最常用方式之一。
    VI.控制播放
    1.一旦创建故事版,就可以使用其他动作控制故事板,这些动作类都继承自
    ControllableStoryboardAction类,控制故事版的主要类如下:
    (1)、PauseStoryboard 停止播放动画并且保持当前位置 。
    (2)、ResumeStoryboard 恢复播放暂停的动画。
    (3)、StopStoryboard 停止播放动画,并将动画时钟重新设置到开始位置。
    (4)、SeekStoryboard 跳到动画时间线中的特定位置,如果当前动画正在播放,就继续从新位置播放。如果当前动画是暂停的,就继续保持暂停。
    (5)、SetStoryboardSpeedRatio 改变整个故事板的SpeedRatio属性值。
    (6)、SkipStoryboardToFill 将故事板移动到时间线的终点。FillBehavior属性设置为(7)、HoldEnd,动画继续保持最后的值。
    (8)、RemoveStoryboard 移除故事板,停止所有正在运行的动画,并将属性返回为原来的、最后一次设置的数值。
    在这里插入图片描述
    (9)、点击开始按钮图片透明度逐渐减少,点击暂停按钮动画暂停或继续执行动画,点击恢复按钮暂停的动画继续执行,点击停止按钮动画停止恢复到原来开始状态,点击移除按钮动画移除恢复原来状态。
    (10)、必须在同一个Triggers集合中定义所有的触发器,如果将BeginStoryboard动作的触发器和PauseStoryboard动作的触发器放置到不同的集合中,PauseStoryboard动作就无法工作。
    2.故事板事件
    (1)、Completed 动画已经到达终点 。
    在这里插入图片描述
    (2)、CurrentGlobalSpeedInvalidated 速度发生了变化,或者动画被暂停、重新开始、停止或移到某个新的位置。
    在这里插入图片描述
    (3)、CurrentStateInvalidated 动画已经开始或结束,在动画执行的开始和动画执行结束后触发。
    在这里插入图片描述
    (4)、RemoveRequested 动画正在被移除时触发事件。
    2.(1)、监视动画进度:
    如果要监视动画,要用到Storyboard的一些事件。在这里使用的是CurrentTimeInvalidated事件,每次向前移动动画时钟都会引发该事件。当引发 CurrentTimeInvalidated事件时,发送者是Clock对象(Color类位于System.Windows.Media.Animation名称空间中),可通过Clock对象检索当前时间,当前时间使用TimeSpan对象表示,并且可检索当前进度,当前进度使用0~1之间的数值表示。
    (2)、CurrentTimeInvalidated 动画时钟已经向前移动了一个步长,正在更改动画。当动画开始、停止或结束时也会引发该事件,即在动画执行开始和变化中与结束执行。
    在这里插入图片描述
    (3)、进行动画监测,利用进度条直观的显示动画的进度,通过Clock对象检索当前时间,当前时间使用TimeSpan对象表示,可检索当前进度。
    在这里插入图片描述
    在这里插入图片描述

    展开全文
  • WPF 动画系统

    2019-04-01 11:20:35
    WPF提供了一个更高级的模型,通过该模型可以只关注动画的定义,而不考虑它们的渲染方式,这个模型基于依赖项属性基础架构,本质上,WPF动画只不过是在一段时间间隔内修改依赖项属性值的一种方式。不过还有另外一个...

    1、基本动画。
    WPF提供了一个更高级的模型,通过该模型可以只关注动画的定义,而不考虑它们的渲染方式,这个模型基于依赖项属性基础架构,本质上,WPF动画只不过是在一段时间间隔内修改依赖项属性值的一种方式。不过还有另外一个限制,为了实现属性的动态化,需要有支持相应数据类型的动画类,例如Button.Width属性使用双精度数据类型,为实现属性的动态化,需要使用DoubleAnimation类,但Button.Padding属性使用的是Thickness结构,所以需要使用ThicknessAnimation类。为了为属性应用动画,可以针对相应的数据类型创建自己的动画类,你将发现,System.Windows.Media.Animation名称空间已经为希望使用的大多数数据类型提供了动画类。

    2、Animation类。
    实际上有两种类型的动画,一种是在开始值和结束值之间以逐步增加的方式改变属性的动画(线性插值过程),另一种是从一个值突然变成另一值得动画(关键帧动画)。所有关键帧动画都使用 "类型名 + AnimationUsingKeyFrames " 的形式进行命名,比如StringAnimationUsingKeyFrames和ObjectAnimationUsingKeyFrames。某些数据类型有关键帧动画类,但没有插值动画类。例如,可使用关键帧为字符串应用动画,不能使用插值为字符串应用动画。然而,所有数据类型都支持关键帧动画,除非他们根本不支持动画。所有具有(使用插值)常规动画类的数据类型,也都有相应的关键帧动画的动画类型,如线性插值的DoubleAnimation对应DoubleAnimationUsingKyyFrames。另外还有一种基于路径的动画。因此,WPF动画使用三种方法:线性插值、关键帧和路径。在System.Windows.Media.Animation名称空间中将发现以下内容:

    7个 “类型名+Animation类” 这些类使用插值动画。

    22个 “类型名+AnimationUsingKeyFrames” 这些类使用关键帧动画。

    3个 "类型名+AnimationUsingPath"类这类使用基于路径的动画。

    3、使用代码创建动画。
    wpf中,最常用的动画技术是线性插值动画,标准的帧速率是60秒/帧,使用动画的最简单方式是实例化在前面列出的其中一个动画类,然后使用修改元素的BeginAnimation()方法,所有wpf元素,从UIElement基类开始,都继承了BeginAnimation()方法,该方法是IAnimatable接口的一部分。

    xaml代码:

    <Button Width="150" Height="60" Grid.Row="0" Click="Button_Click">点击开始动画</Button>
    <Button Grid.Row="1" Name="btn1" Width="150" Height="60" Content="动画按钮"></Button>
    

    后台代码:

    private void Button_Click(object sender, RoutedEventArgs e)
    {
        //实例化一个DoubleAnimation类。
        DoubleAnimation doubleAnimation = new DoubleAnimation();
        //设置From属性。
        doubleAnimation.From = btn1.Width;
        //设置To属性。
        doubleAnimation.To = 250;
        //设置Duration属性。
        doubleAnimation.Duration = new Duration(TimeSpan.FromSeconds(5));
        //为元素设置BeginAnimation方法。
        btn1.BeginAnimation(Button.WidthProperty, doubleAnimation);
    }
    

    在这里插入图片描述
    其中, From属性是元素的开始值,To属性是元素属性的结束值,Duration是整个动画执行的时间。即使不使用To属性,也可以使用By属性,By值被简单地增加到From值上,使其达到To值。不过,对于非数值数据类型来说,By属性是没有意义的。

    4、同时发生的动画。
    就是创建多个Animation动画,然后为元素设置属性。

    private void Button_Click(object sender, RoutedEventArgs e)
    {
        //实例化一个DoubleAnimation类。
        DoubleAnimation doubleAnimation = new DoubleAnimation();
        //设置From属性。
        doubleAnimation.From = btn1.Width;
        //设置To属性。
        doubleAnimation.To = 250;
        //设置Duration属性。
        doubleAnimation.Duration = new Duration(TimeSpan.FromSeconds(5));
        //为元素设置BeginAnimation方法。
        btn1.BeginAnimation(Button.WidthProperty, doubleAnimation);
    
        //实例化一个DoubleAnimation动画,用于设置元素的高。
        DoubleAnimation doubleAnimationHeight = new DoubleAnimation();
        //设置Form属性。
        doubleAnimationHeight.From = btn1.Height;
        //设置To属性的值。
        doubleAnimationHeight.By = 70;
        //设置时间。
        doubleAnimationHeight.Duration = new Duration(TimeSpan.FromSeconds(3));
        //开始动画。
        btn1.BeginAnimation(Button.HeightProperty, doubleAnimationHeight);
    }
    

    5、动画的生命周期。
    从技术的角度看,WPF动画只是暂时的,这意味着它们不能真正改变基本属性的值,当动画处于活动状态时,只是覆盖了属性的值。

    单向动画,在动画运行结束后会保持处于活动状态,这是因为动画需要将按钮的宽度保持为新值,这回导致如下常见问题,如果尝试使用代码在动画完成后修改属性值,代码将不会起作用,因为代码只是为属性指定了一个新的本地值,但仍会先试用动画之后的属性值。

    为了解决动画完成后能修改属性的值,有以下方法可解决。

    a)、设置AutoReverse属性,如果将该属性设置为true,将会反向运动,返回原始的值(不适合动画完成后,再为属性设置最后的值,只是还原为动画之前的值)。

    b)、改变FillBehavior属性。通常,FillBehavior属性设置为HoldEnd,这意味着当当动画结束时,会继续为目标元素应用最后的值。如果将FillBehavior属性改为Stop,只要动画结束,属性就会恢复为原来的值(适用于动画结束后,再次为其设置新值,一般不与AutoReverse配合着使用,这两个用其中一个就行了)。

    6、动画的Completed事件。
    使用Completed事件时,要将事件设置BeginAnimation()方法之前,否则不起作用。在Completed中,可通过调用BeginAnimation()方法来渲染不活动的动画,为此,只需要指定属性,并为动画对象传递null引用。

    void doubleAnimationHeight_Completed(object sender, EventArgs e)
    {
        MessageBox.Show("动画的高执行完毕了!!!");
        //设置空引用。
        btn1.BeginAnimation(Button.HeightProperty, null);
    }
    

    7、TimeLine类。

    在这里插入图片描述

    7.1)、AccelerationRatio和DeceleRation属性。
    可以通过AcclerationRation和DecelerationRation属性压缩部分时间轴,使动画运行的更快,并将拉伸其他时间进行补偿,使总时间保持不变。这两个属性都表示百分比值,例如,将AcceleRation属性设置为0.3,表示希望使用动画持续时间中前30%的时间进行加速。例如在1个10秒的动画中,前3秒会加速运行,而剩余的7秒会以恒定不变的速度运行,如果将DeceleRation属性设置为0.3,那么最后3秒回减速运行。

    private void Button_Click(object sender, RoutedEventArgs e)
    {
        //实例化一个DoubleAnimation类。
        DoubleAnimation doubleAnimation = new DoubleAnimation();
        //设置From属性。
        doubleAnimation.From = btn1.Width;
        //前5秒加速度运行。
        doubleAnimation.AccelerationRatio = 0.5;
        //后2秒减速运行
        doubleAnimation.DecelerationRatio = 0.2;
        //设置To属性。
        doubleAnimation.To = 1000;
        //设置Duration属性。
        doubleAnimation.Duration = new Duration(TimeSpan.FromSeconds(10));
        //为元素设置BeginAnimation方法。
        btn1.BeginAnimation(Button.WidthProperty, doubleAnimation);
    }
    

    7.2)、RepeatBehavior属性。
    使用RepeataBehavior属性可以控制如何重复运行动画,如果希望重复固定次数,应为RepeatBehavior构造函数传递合适的次数。

    还可设置RepeatBehavior为永久重复。 //设置重复次数为3次。 doubleAnimation.RepeatBehavior = new RepeatBehavior(3); //设置永久重复动画。 doubleAnimation.RepeatBehavior = RepeatBehavior.Forever;

    8、故事版。
    WPF动画通过一组动画类表示,使用少数几个属性设置相关信息,如开始值、结束值以及持续时间。这显然使他们非常适合于XAMl,不是很清晰的是,如何为特定的事件和属性关联动画,以及如何在正确的时间触发动画。

    故事板:故事板是BeginAnimation()方法的XAML等价物,通过故事板将动画指定到合适的元素和属性。

    事件触发器:事件触发器响应属性变化或事件(如按钮的Click事件),并控制故事板。

    故事板:
    故事板是增强的时间线,可用来分组多个动画,而且具有控制动画播放的能力—暂停、停止以及播放位置。然而Storyboard类提供的最基本功能是,能够使用TargetProperty和TargetName属性指向某个特定属性和特定元素,换句话说,故事板在动画和希望应用动画的属性之间架起了一座桥梁。其中TargetProperty属性和TargetName属性都是附加属性。

    <!--创建一个故事板-->
    <Storyboard Storyboard.TargetProperty="Width">
        <!--创建一个DoubleAnimation类。-->
        <DoubleAnimation To="350"  RepeatBehavior="Forever" Duration="0:0:3"></DoubleAnimation>
    </Storyboard>
    
    <!--由于Storyboard.TargetProperty属性是附加属性,因此还可以写出-->
    <Storyboard >
        <!--创建一个DoubleAnimation类。-->
        <DoubleAnimation Storyboard.TargetProperty = "Width" To="350"  RepeatBehavior="Forever" Duration="0:0:3"></DoubleAnimation>
    </Storyboard>
    

    事件触发器:

    可以在以下4个位置定义事件触发器。

    a)、在样式中(Style.Triggers集合)。

    b)、在数据模板中(DataTemplate.Triggers集合)。

    c)、在控件模板中(ControlTemplate.Triggers集合)。

    d)、直接在元素中定义事件触发器(FrameworkElement.Triggers集合)。

    当创建事件触发器时,需要指定开始触发器的路由事件和触发器执行的一个或多个动作。对于动画,最常用的动作是BeginStoryboard,该动作相当于调用BeginAnimation()方法。所有事件触发器都可以启动动作,所有动作都由继承自System.Windows.TriggerAction的类表示。

    xaml代码:

    <Button Width="200" Height="80" Content="事件触发器" FontSize="20">
        <!--元素触发器-->
        <Button.Triggers>
            <!--定义事件触发器-->
            <EventTrigger RoutedEvent="Button.Click">
                <!--执行一个动作-->
                <EventTrigger.Actions>
                    <!--开始故事板-->
                    <BeginStoryboard>
                        <!--创建一个故事板-->
                        <Storyboard >
                            <!--创建一个DoubleAnimation类。-->
                            <DoubleAnimation Storyboard.TargetProperty = "Width" To="350"  RepeatBehavior="Forever" Duration="0:0:3"></DoubleAnimation>
                        </Storyboard>
                    </BeginStoryboard>
                </EventTrigger.Actions>
            </EventTrigger>
        </Button.Triggers>
    </Button>
    

    在这里插入图片描述
    9、使用样式关联触发器。
    有三种基本类型的WPF触发器:属性触发器、数据触发器以及事件触发器。使用触发器是关联动画的最常用方式,但并不是唯一的选择。

    xaml代码:

    <Window.Resources>
        <Style  TargetType="Button">
            <Setter Property="FontSize" Value="20"></Setter>            
            <Style.Triggers>
                <!--使用属性触发器-->
                <Trigger Property="IsPressed" Value="True">
                    <!--在这里使用的是EnterActions-->
                    <Trigger.EnterActions>
                        <BeginStoryboard>
                            <Storyboard Storyboard.TargetProperty="Width">
                                <DoubleAnimation To="300" RepeatBehavior="Forever" Duration="0:0:3"></DoubleAnimation>
                            </Storyboard>
                        </BeginStoryboard>
                    </Trigger.EnterActions>
                </Trigger>
        </Style>
    </Window.Resources>
    
    <Grid>
        <Button Width="200" Height="80"  Content="使用样式关联触发器"></Button>
    </Grid>
    

    在这里插入图片描述
    10、同步的动画。
    StoryBoard类间接地继承自TimeLineGroup类,所以StoryBoard类能包含多个动画,这些动画可以作为一组进行管理,这意味着它们可以在同一时间开始。

    <Window.Resources>
        <Style TargetType="Button">            
            <Setter Property="FontSize" Value="20"></Setter>            
            <Style.Triggers>
                <Trigger Property="IsPressed" Value="True">
                    <Trigger.EnterActions>
                        <BeginStoryboard>
                            <Storyboard>
                                <DoubleAnimation Storyboard.TargetProperty="Width" To="300" Duration="0:0:3"></DoubleAnimation>
                                <DoubleAnimation Storyboard.TargetProperty="Height" To="100" Duration="0:0:3"></DoubleAnimation>
                            </Storyboard>
                        </BeginStoryboard>
                    </Trigger.EnterActions>
                </Trigger>
            </Style.Triggers>
        </Style>
    </Window.Resources>
        
    <Grid>
        <Button Width="150" Height="70" Content="同步动画"></Button>
    </Grid>
    

    在这里插入图片描述
    11、控制播放。
    到目前为止,已经在事件触发器中使用了一个动作,加载动画的BeginStoryboard动作,然而,一旦创建故事版,就可以使用其他动作控制故事板,这些动作类都继承自ControllableStoryboardAction类,控制故事版的主要类如下:

    在这里插入图片描述
    为成功地执行这些动作,必须在同一个Triggers集合中定义所有的触发器,如果将BeginStoryboard动作的触发器和PauseStoryboard动作的触发器放置到不同的集合中,PauseStoryboard动作就无法工作。

    xaml代码:

    <Window x:Class="控制播放.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            Title="MainWindow" Height="350" Width="525">
        <Window.Triggers>
            <!--开始事件-->
            <EventTrigger RoutedEvent="Button.Click" SourceName="btn_start">
                <BeginStoryboard Name="beginstoryboard1">
                    <Storyboard>
                        <DoubleAnimation Storyboard.TargetName="img" Storyboard.TargetProperty="Opacity" From="1" To="0" Duration="0:0:6"></DoubleAnimation>
                    </Storyboard>
                </BeginStoryboard>
            </EventTrigger>
    
            <!--停止动画-->
            <EventTrigger RoutedEvent="Button.Click" SourceName="btn_pause">
                <PauseStoryboard BeginStoryboardName="beginstoryboard1"></PauseStoryboard>
            </EventTrigger> 
            
            <!--恢复动画-->
            <EventTrigger RoutedEvent="Button.Click" SourceName="btn_resume">
                <ResumeStoryboard BeginStoryboardName="beginstoryboard1"></ResumeStoryboard>
            </EventTrigger>
            
            <!--停止动画-->
            <EventTrigger RoutedEvent="Button.Click" SourceName="btn_stop">
                <StopStoryboard BeginStoryboardName="beginstoryboard1"></StopStoryboard>
            </EventTrigger>
    
            <!--移除动画-->
            <EventTrigger RoutedEvent="Button.Click" SourceName="btn_remove">
                <RemoveStoryboard BeginStoryboardName="beginstoryboard1"></RemoveStoryboard>
            </EventTrigger>        
        </Window.Triggers>
        
        <Grid>
            <Grid.RowDefinitions>
                <RowDefinition Height="3*"></RowDefinition>
                <RowDefinition></RowDefinition>
            </Grid.RowDefinitions>   
            
            <Image  Name="img" Source="1.jpg"></Image>
            
            <Grid Grid.Row="1">
                <Grid.ColumnDefinitions>
                    <ColumnDefinition></ColumnDefinition>
                    <ColumnDefinition></ColumnDefinition>
                    <ColumnDefinition></ColumnDefinition>
                    <ColumnDefinition></ColumnDefinition>
                    <ColumnDefinition></ColumnDefinition>
                </Grid.ColumnDefinitions>
                <Button Name="btn_start" Content="开始" Margin="10" FontSize="20" Grid.Column="0"></Button>
                <Button Name="btn_pause" Content="暂停" Margin="10" FontSize="20" Grid.Column="1"></Button>
                <Button Name="btn_resume" Content="恢复" Margin="10" FontSize="20" Grid.Column="2"></Button>
                <Button Name="btn_stop" Content="停止" Margin="10" FontSize="20" Grid.Column="3"></Button>
                <Button Name="btn_remove" Content="移除" Margin="10" FontSize="20" Grid.Column="4"></Button>
            </Grid>
        </Grid>
    </Window>
    

    在这里插入图片描述
    分析:在包含元素的Triggers集合中(在这里是Window.Triggers集合),使用EventTrigger.SourceName属性关联这些事件触发器,只要SourceName属性和为按钮设置的Name属性相匹配,触发器就会用到恰当的按钮上。还必须要问BeginStoryboard动作指定名称,这样其他触发器BeginStoryboardName属性指定这个名称,连接到相同的故事板,然后进行控制。

    12、故事板事件。
    在这里插入图片描述
    故事板事件
    Completed 动画已经到达终点
    CurrentGlobalSpeedInvalidated 速度发生了变化,或者动画被暂停、重新开始、停止或移到某个新的位置。
    CurrentStateInvalidated 动画已经开始或结束。
    CurrentTimeInvalidated 动画时钟已经向前移动了一个步长,正在更改动画。当动画开始、停止或结束时也会引发该事件。
    RemoveRequested 动画正在被移除。

    监视动画进度:

    如果要监视动画,要用到Storyboard的一些事件。在这里使用的是CurrentTimeInvalidated事件,每次向前移动动画时钟都会引发该事件。当引发CurrentTimeInvalidated事件时,发送者是Clock对象(Color类位于System.Windows.Media.Animation名称空间中),可通过Clock对象检索当前时间。当前时间使用TimeSpan对象表示,并且可检索当前进度,当前进度使用0~1之间的数值表示。

    后台代码:

    就是在上面的例子中为故事板加一个CurrentTimeInvalidated事件,然后再界面中放一个label控件(用于显示时间)和ProgressBar(用于显示进度,最大值为1,最小值为0)控件。

    private void Storyboard_CurrentTimeInvalidated(object sender, EventArgs e)
    {
        Clock storyboardClock = (Clock)sender;
        if (storyboardClock.CurrentProgress == null)
        {
            lblTime.Content = "";
            progressBar1.Value = 0;
        }
        else
        {
            lblTime.Content = storyboardClock.CurrentTime.ToString();
            progressBar1.Value = (double)storyboardClock.CurrentProgress;
        }
    }
    

    在这里插入图片描述
    13、动画缓动。
    线性动画有一个缺点,通常让人觉得机械和不够自然。改进动画并创建更趋自然的动画的秘诀是改变变化速率。不是创建以固定不变的速率改变属性的动画,而是需要设计根据某种方式加速或减速的动画,实现更趋自然的动画的最简单方法是使用预置的缓动函数(EasingFunction)。EasyingFunction属性只能接受单个缓动函数对象,所以不能为同一个动画结合不同的缓动函数。

    xaml代码

    <Window.Resources>
        <Style TargetType="Button">
            <Style.Triggers>
                <EventTrigger RoutedEvent="Click">
                    <EventTrigger.Actions>
                        <BeginStoryboard>
                            <Storyboard Storyboard.TargetProperty="Width">
                                <DoubleAnimation To="300" Duration="0:0:5">
                                    <!--使用缓动函数-->
                                    <DoubleAnimation.EasingFunction>
                                        <!--设置缓动模式和振荡次数-->
                                        <ElasticEase EasingMode="EaseOut" Oscillations="5"></ElasticEase>
                                    </DoubleAnimation.EasingFunction>
                                </DoubleAnimation>
                            </Storyboard>
                        </BeginStoryboard>
                    </EventTrigger.Actions>
                </EventTrigger>
            </Style.Triggers>
        </Style>
    </Window.Resources>   
    <Grid>
         <Button Width="150" Height="50" Content="缓动动画" FontSize="20"></Button>
    </Grid>
    

    在这里插入图片描述
    14、缓动函数类。
    在继续分析不同的缓动类之前,理解缓动函数的应用时机是很重要的。所有的缓动函数类都继承自EasingFunctionBase类,并且继承了EasingMode属性,EasingMode有三种值,分别是:EasyIn(在动画开始时应用缓动效果)、EasyOut(动画结束时应用缓动效果)和EasyInOut(在开始和结束时应用缓动动画)。当应用缓动函数时不会改变动画的持续时间。
    在这里插入图片描述
    15、自定义缓动函数。
    创建自定义缓动函数一般需要以下几个步骤:

    a)、新建一个类,让其继承自EasingFunctionBase类。

    b)、重写EaseInCore()方法和CreateInstanceCore()方法。

    c)、定义依赖属性。

    d)、引用。

    后台代码(自定义类):

    public class RandomJitterEase : EasingFunctionBase
    {
        //声明一个Random类,用于声明随机数。
        Random rand = new Random();
        /// <summary>
        /// 重写EaseCore方法。 
        /// </summary>
        /// <param name="normalizedTime"></param>
        /// <returns></returns>
        protected override double EaseInCore(double normalizedTime)
        {
            //几乎所有逻辑代码都在EaseInCore方法中运行。该方法接受一个规范化的时间值,本质上是表示动画进度从
            //0到1之间的值,当动画开始时,规范化的时间值是0,它从该点开始增加,直到在动画结束点达到1.
            //在动画运行期间,每次更新动画的值时,WPF都会调用EaseInCore方法,确切的调用频率取决于动画的帧率。
            if (normalizedTime == 1)
            {
                return 1;
            }
            else
            {
                return Math.Abs(normalizedTime - (double)rand.Next(0, 10) / (2010 - Jitter));
            }
        }
    
        protected override System.Windows.Freezable CreateInstanceCore()
        {
            return new RandomJitterEase();
        }
    
        //定义一个依赖属性。
        public static readonly DependencyProperty JitterProperty;
    
        //在静态方法中注册依赖属性。
        static RandomJitterEase()
        {
            JitterProperty = DependencyProperty.Register("Jitter", typeof(int), typeof(RandomJitterEase), new UIPropertyMetadata(1000), new ValidateValueCallback(ValidateJitter));
        }
    
        public int Jitter
        {
            get { return (int)GetValue(JitterProperty); }
            set { SetValue(JitterProperty, value); }
        }
    
        //此方法用于判断值。
        private static bool ValidateJitter(object value)
        {
            int jitterValue = (int)value;
            if (jitterValue <= 2000 && jitterValue >= 0)
            {
                return true;
            }
            else
            {
                return false;
            }
        }
    }
    

    xaml代码:

    <Window x:Class="自定义缓动函数.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:local="clr-namespace:自定义缓动函数"
            Title="MainWindow" Height="350" Width="525">
        
        <Window.Triggers>
            <!--事件触发器,窗体加载的Loaded事件。-->
            <EventTrigger RoutedEvent="Window.Loaded">
                <EventTrigger.Actions>
                    <BeginStoryboard>
                        <Storyboard>
                            <DoubleAnimation Storyboard.TargetName="ellipse1" Storyboard.TargetProperty="(Canvas.Left)" From="0" To="480" Duration="0:0:5"></DoubleAnimation>
                            <DoubleAnimation Storyboard.TargetName="ellipse2" Storyboard.TargetProperty="(Canvas.Left)" From="0" To="480" Duration="0:0:5">
                                <DoubleAnimation.EasingFunction>
                                    <!--调用自定义缓动函数类-->
                                    <local:RandomJitterEase EasingMode="EaseIn" Jitter="1500"></local:RandomJitterEase>
                                </DoubleAnimation.EasingFunction>
                            </DoubleAnimation>
                        </Storyboard>
                    </BeginStoryboard>
                </EventTrigger.Actions>
            </EventTrigger>
        </Window.Triggers>        
            
        <Canvas ClipToBounds="True">
            <Ellipse Name="ellipse1" Width="25" Height="25" Fill="Red"></Ellipse>
            <Ellipse Margin="0,70,0,0" Name="ellipse2" Width="25" Height="25" Fill="Green"></Ellipse>
        </Canvas>    
    </Window>
    

    在这里插入图片描述
    16、WPF动画性能和帧率。
    通常,为用户界面应用动画,只不过是创建并配置正确的动画和故事版对象。但在其他情况下,特别是同时发生多个动画时,可能更加需要关注性能。WPF试图保持以60帧/秒的速度进行动画,可以确保从开始到结束得到平滑流畅的动画。帧速率越低,会发生抖动现象。帧速率越高,占用的CPU也就越高。通过TimeLine.DesiredFrameRate属性进行调整。

    xaml代码:

    <Window x:Class="动画性能之帧率.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:local="clr-namespace:动画性能之帧率"
            Title="MainWindow" Height="500" Width="525">    
        <Window.Triggers>
            <!--定义一个事件触发器,通过SourceName属性关联button-->
            <EventTrigger RoutedEvent="Button.Click" SourceName="btn_start">
                <EventTrigger.Actions>
                    <BeginStoryboard>
                        <!--通过Timeline.DesiredFrameRate属性设置帧速率-->
                        <Storyboard Storyboard.TargetName="ellipse" Timeline.DesiredFrameRate="{Binding ElementName=txtBox1, Path=Text}">
                            <DoubleAnimation Storyboard.TargetProperty="(Canvas.Top)" From="0"  To="300" Duration="0:0:10"></DoubleAnimation>
                            <DoubleAnimation Storyboard.TargetProperty="(Canvas.Left)" From="0" To="250" Duration="0:0:10"></DoubleAnimation>
                        </Storyboard>
                    </BeginStoryboard>
                </EventTrigger.Actions>
            </EventTrigger>
        </Window.Triggers>    
        
        <Grid ShowGridLines="False">
            <Grid.RowDefinitions>
                <RowDefinition Height="5*"></RowDefinition>
                <RowDefinition></RowDefinition>
                <RowDefinition></RowDefinition>            
            </Grid.RowDefinitions>
            
            <Grid.ColumnDefinitions >
                <ColumnDefinition></ColumnDefinition>
                <ColumnDefinition></ColumnDefinition>
            </Grid.ColumnDefinitions>  
            
            <Canvas ClipToBounds="True" Grid.Row="0" Grid.ColumnSpan="2" Height="320" Background="Beige">
                <Ellipse Name="ellipse" Fill="Red" Width="10" Height="10"></Ellipse>
            </Canvas>
            
            <Label Grid.Row="1" Content="帧速率:" FontSize="20" HorizontalAlignment="Right" VerticalAlignment="Center"></Label>
            <TextBox Name="txtBox1" Text="1" Width="60" Height="30" FontSize="20" Grid.Row="1" Grid.Column="1" HorizontalAlignment="Left" VerticalAlignment="Center"></TextBox>
            <Button  Name="btn_start" Grid.Row="2" Grid.ColumnSpan="2" Width="200" Height="60" Content="点击动画" FontSize="20"></Button>
        </Grid>
    </Window>
    

    在这里插入图片描述

    转载自:https://www.cnblogs.com/xiezunxu/articles/8965848.html:

    展开全文
  • C#WPF XAML 绘图、画笔、特效 一、绘图 I.绘图有两种方式:形状绘图和几何绘图。 1.(1)、形状(Shape)是一个2D绘图类,位于System.Windows.Shape空间内。 2.包含最常用的绘图对象:Line(直线)、Rectangle(矩形)、...

    C#WPF XAML 绘图、画笔、特效

    一、绘图
    I.绘图有两种方式:形状绘图和几何绘图。
    1.(1)、形状(Shape)是一个2D绘图类,位于System.Windows.Shape空间内。
    2.包含最常用的绘图对象:Line(直线)、Rectangle(矩形)、Ellipse(椭圆)、Polygon(多边形)、Path(路径)。
    (1)、图形对象共有属性:Stroke(如何使用绘制图形的轮廓,既所使用的画刷)、StrokeThickness(图形轮廓的粗细)、Fill(绘制图形的内部)。
    (2)、指定图形的坐标位置和顶点的数据属性,以与设备无关的像素来度量。
    在这里插入图片描述
    (3)、直线是最简单的图形。使用X1、Y1两个属性可以设置它的起点坐标,X2、Y2两个属性则用来设置其终点坐标。控制起点/终点坐标就可以实现平行、交错等效果。
    (4)、Stroke(笔触)属性的数据类型是Brush(画刷),凡是Brush的派生类均可用于给这个属性赋值。因为WPF提供了多种渐变色画刷,所以画直线也可以画出渐变效果。同时,Line 的一些属性还帮助我们画出虚线以及控制线段终点的形状。下面的例子综合了这些属性。
    (5)、Y2控制向左倾斜,Y1控制向右倾斜,“StrokeDashArray”控制虚线密度,StrokeEndLineCap直线结束形状与StrokeStartLineCap直线开始形状:Flat(矩形)、Round(圆形)、Square(矩形)、Triangle(尖头形状)。
    在这里插入图片描述
    3.Rectangle(矩形)
    (1)、矩形由笔触(Stroke,即边线)和填充(Fill)构成。Stroke属性的设置与Lin一
    样,Fill属性的数据类型是Brush。Brush是个抽象类,所以我们不可能拿一个Brush类的实例为Fill属性赋值而只能用Brush派生类的实例进行赋值。WPF的绘图系统包含非常丰富的Brush类型。
    (2)、SolidColorBrush:实心画刷。在XAML中可以使用颜色名称字符串(如Red、Blue)
    直接赋值。
    (3)、RadiusX="30"和RadiusY="100"是设置圆角效果。
    在这里插入图片描述
    (4)、LinearGradientBrush:线性渐变画刷。色彩沿设定的直线方向、按设定的变化点进
    行渐变。
    (5)、RadialGradientBrush:径向渐变画刷。色彩沿半径的方向、按设定的变化点进行渐
    变,形成圆形填充。
    (6)、 线性渐变:StartPoint=“0,0” EndPoint="1,1"起点为左上角终点为右下角,
    (0,0 1,0)起点为左上角终点为左下角、(0,0 1,0,5)起点为左上角终点为右边一半。
    在这里插入图片描述
    (7)、ImageBrush:使用图片(Image)作为填充内容。
    (8)、DrawingBrush:使用矢量图(Vector)和位图(Bitmap)作为填充内容。
    Viewport:设置平铺的范围、TileMode:设置平铺的方式(Absolute绝对平铺、RelativeToBoundingBox相对平铺)。
    (9)、ViewportUnits:设置平铺的相对/绝对坐标,即图片在哪平铺,Viewport=“0, 0, 0.5, 0.5” 表示要平铺图片在矩形框的位置,(0,0)代表起点坐标,(0.5,0.5)代表重点坐标。
    (10)、VisualBrush:WPF中的每个控件都是由FrameworkElement类派生来的,而
    (11)、FrameworkElement又是由Visual类的方法获得。获得这个可视化的形象后,我们可以用这个形象进行填充,这就是VisualBrush。比如当我想把窗体上的某个控件拖拽
    到另一个位置,当鼠标松开之前需要在鼠标指针下显示一个控件的“幻影”,这个“幻
    影”就是用VisualBrush填充出来的一个矩形,并让矩形捕捉鼠标的位置、随鼠标移动。
    在这里插入图片描述
    3.Ellipse(椭圆)
    椭圆也是一种常见的几何图形,它的使用方法与矩形没有什么区别。下面的例子是绘
    制一个球体,球体的轮廓是正圆(Circle),Width与Height相等的椭圆即是正圆;球体的
    光影效果使用径向渐变实现。
    在这里插入图片描述在这里插入图片描述
    4.Polygon(多边形)
    使用“Polygon”定义多边形,多边形是一个闭合体,“Points”属性设置边前面数值要和后面的数值保持一致才能形成闭合体。
    在这里插入图片描述
    使用“Polyline”定义多线形,多线形不是闭合体,
    在这里插入图片描述
    5.Path(路径)
    (1)、Path类可以绘制曲线和复杂的形状。
    (2)、Data属性使用了mini-language(路径标记语法)。
    (3)、路径(Path)可以说是WPF绘图中最强大的工具,一来是因为它完全可以替代其他
    几种图形,二来它可以将直线、圆弧、贝斯二曲线等基本元素结合进来,形成更复杂的
    图形。路径最重要的一个属性是Data,Data的数据类型是Geometry(几何图形),我们
    正是使用这个属性将一些基本的线段拼接起来、形成复杂的图形。
    (4)、为Data属性赋值的语法有两种:一种是标签式的标准语法,另一种是专门用户绘制几何图形的“路径标记语法”。借助标准语法认识各种基本线段,和学习绘制几何图形的路径标记语法。
    (5)、想要使用Path绘制图形,首先要知道几何图形数据是如何组合在Data属性中的。Path的Data属性是Geometry类,但Geometry类是个抽象类,所以我们不可能在XAML中直接使用标签。
    (6)、我们可以使用的是Geometry的子类。Geometry子类包括:
    LineGeometry:直线几何图形。
    RectangleGeometry:矩形几何图形。
    EllipseGeometry:椭圆几何图形。
    PathGeometry:路径几何图形。
    StreamGeometry:PathGeometry的轻量级替代品,不支持Binding、动画等功能。
    CombinedGeometry:由多个基本几何图形联合在一起,形成的单一几何图形。
    GeometryGruop:由多个基本几何图形组成在一起,形成的几何图形组。
    II.几何绘图
    1.(1)、几何绘图与图形绘图的区别:图形对象可以独立存在的,可以独立绘制出具体需要的图形、几何图形对象没有具体的形体,它需要依赖于某一对象元素而存在,不能直接呈现在画板上。
    (2)、几何绘图包括5种对象:LineGeometry(确定两点绘制一条直线)、RectangleGeometry(绘制矩形的几何图形)、EllipseGeometry(绘制椭圆形的几何图形)、GeometryGroup(组合几何对象,将多个单一的几何对象组合成一个几何对象)、PathGeometry(路径几何对象)。
    (3)、LineGeometry(确定两点绘制一条直线),StartPoint(起点)EndPoint(终点)。
    在这里插入图片描述
    (4)、RectangleGeometry(绘制矩形的几何图形),RadiusX(控制圆角) RadiusY(控制圆形)。
    在这里插入图片描述
    (5)、EllipseGeometry(绘制椭圆形的几何图形),RadiusX(控制垂直方向)RadiusY(控制水平方向)。
    在这里插入图片描述
    2.、Path可以用这些形状绘制:
    (1)、ArcSegment 类 表示两点之间的一条椭圆弧,用来绘制圆弧的五个属性。
    ①.Point属性用来指明圆弧连接的终点;
    ②.圆弧截取自椭圆,Size属性即是完整椭圆的横轴半径和纵轴半径;
    ③.SweepDirection属性指明圆弧是顺时针方向还是逆时针方向;如果椭圆上的两点位置不对称,那么这两点的圆弧就会分为大弧和小弧,IsLargeArc 属性用于指明是否使用大弧去连接;
    ④.RotationAngle属性用来指明圆弧母椭圆的旋转角度。
    (2)、BezierSegment(三次方贝塞尔曲线)类表示在两个点之间绘制的一条三次贝塞尔曲线,由4个点决定:
    ①.起点:即前一个线段的终点或PathFigure的StartPoint。
    ②.终点:Point3属性,即曲线的终点位置。
    ③.两个控制点:Point1和Point2属性。
    ④.三次方贝塞尔曲线就是由起点出发走向Point1的方向,再走向Point2的方
    向,最后到达终点的平滑曲线。
    在这里插入图片描述
    (3)、LineSegment 类 在PathFigure中的两个点之间创建一条直线。
    在这里插入图片描述
    (4)、PolyBezierSegment 类 表示一条或多条三次方贝塞尔曲线。
    (5)、PolyLineSegment 类 表示由PointCollection 定义的线段集合,每个Point指
    线段的终点。
    (6)、PolyQuadraticBezierSegment 类 表示一系列二次贝塞尔线段。
    (7)、QuadraticBezierSegment(二次贝塞尔曲线段)类,在PathFigure的两点之间创建一条二次贝塞尔曲线,与BezierSegment类似,只是控制点由两个减少为一个。也就是说,QuadraticBezierSegment 由三个点决定:
    ①.起点:即前一个线段的终点或PathFigure的StartPoint。
    ②.终点:Point2属性,即曲线的终点位置。
    ③.一个控制点:Point1。
    在这里插入图片描述
    (8)、GeometryGruop也是Geometry的一个派生类,它最大的特点是可以将一组PathGeometry组合在一起。
    (9)、 缺点:其标签式语法的烦琐,一般情况下,复杂图形(Path)都是由数十条线段
    连接而成,按照标签式语法,每条线段(Segment)是一个标签、每个标签占据一行,
    一个图形就要占去几十行代码,而这仅仅是一个图形,要组成一个完整的图画往往需要
    十多个图形组合在一起,有可能占据数百行代码,借助专供WPF绘图使用的路径标记语法(Path Markup Syntax)来极大地简化Path的描述。
    在这里插入图片描述
    III、路径标记语法 (Path Markup Syntax)
    1.移动命令:指定startPoint(绘图的起始点),用“M”或“m”表示,使用M时,表示绝对值,使用m时,表示相当于前一定的偏移值。
    2.绘制命令:一个指令集合,用来描述外形轮廓的内容,包含大部分的直线和曲线的绘图指令,包括L、H、V、A、C、Q等。
    3.关闭命令:作用是结束当前的画图,用来闭合整个Path,并在当前点和图形的起点之间画一条线段,使用字母“z”来表示,最后一条线段的终点与第一条线段的起点间会连接上一条直线段。
    4.线段的简记法:可以简写为“L 150,5”,这个L就是路径标记语法的一个“绘图命令”,“H 180”就是指从当前点画一条水平直线,终点的横坐标是180(你不需要考虑纵坐标,它与当前点的纵坐标一 致)。类似地还有V命令,用来画竖直直线。
    5.使用“Visual Studio 2015”自带的设计器“Blend for Visual Studio 2015”Path命令绘制自己喜欢的图形。
    在这里插入图片描述
    (1)、打开“Blend for Visual Studio 2015”新建WPF应用程序,创建的项目和WPF窗口基本一致,“对象和时间线”窗口是实时显示页面控件层级的窗口。
    在这里插入图片描述
    (2)、进行绘图,如果想要绘图自己喜欢的人物图形但又不会画的时候,可以选择把想要的图片设置为背景图片,然后使用画笔对着图片绘制,其中“笔”是绘制直线的,“铅笔”是绘制曲线的。
    在这里插入图片描述
    二、画笔
    I、画刷(使用Blend for Visual Studio 2015)
    1.画刷定义:
    (1)、所有的UI元素都可以通过画刷的设置而改变它们的风格。
    (2)、使用不同的画刷对目标区域进行“绘制”,会有不同的效果。
    (3)、种类:SolidColorBrush(单色实心画刷)、LinearGradientBrush(线性渐变画刷)、RadialGradientBrush(径向渐变画刷Win8应用中不支持)、ImageBrush(图片画刷)。

    2.(1)、SolidColorBrush(单色实心画刷)SolidColorBrush使用纯色绘制区域 Color 。可以通过多种方式指定的 Color ,SolidColorBrush :例如,可以指定其 alpha、红色、蓝色和绿色通道,或使用类提供的预定义颜色之一 Colors 。
    ①.后台写法,实际上就是给“Grid”设置一个“Children”属性。
    在这里插入图片描述
    在这里插入图片描述
    (2)、LinearGradientBrush(线性渐变画刷)LinearGradientBrush使用线性渐变绘制区域。 线性渐变在线条(渐变轴)中混合了两种或多种颜色。 使用 GradientStop 对象可以指定渐变中的颜色及其位置。
    (3)、RadialGradientBrush(径向渐变画刷Win8应用中不支持)RadialGradientBrush使用径向渐变绘制区域。 径向渐变跨一个圆混合两种或多种颜色,与类一样 LinearGradientBrush ,可以使用 GradientStop 对象指定渐变中的颜色及其位置。
    (4)、ImageBrush(图片画刷)ImageBrush使用绘制区域 ImageSource 。
    ①.如果直接引用资源管理器里的图片文件夹的时候会报错,因为系统引用的是整个项目的文件夹,所以需要把图片文件夹放在项目文件夹bin–>Debug里才能引用。
    在这里插入图片描述
    三、图像处理
    1.图像处理三种属性:拉伸图像(通过设置Stretch属性实现图像的拉伸)、裁切图像(通过设置Clip属性裁切图像)、使用图像输入文字(ImageBrush)元素实现使用图像输入文字。
    (1)、Imdge元素的Stretch属性值类型为枚举型,属性值分别为:原始尺寸(None)、填充拉伸(Fill)、等比拉伸(Uniform)、等比拉伸填充(UniformToFill)。
    在这里插入图片描述
    (2)、裁切图像(通过设置Clip属性裁切图像),Width和Height值越大裁切的内容越小。
    在这里插入图片描述
    (3)、使用图像输入文字(ImageBrush)元素实现使用图像输入文字。FontStyle设置字体样式有三个属性:Italic(字体倾斜)、Normal(字体正常)、Oblique(字体倾斜)。
    在这里插入图片描述
    (4)、Opacity设置图片的透明度/毛玻璃效果。
    在这里插入图片描述
    四、RenderTransform特效(变形)
    I、 RenderTransform类:包含的变形属性成员,专门用来改变Silverlight对象形状的实现对元素拉伸、旋转、扭曲等效果,同时变形特效也常用于辅助产生各种动画效果。
    1.RenderTransform类:
    (1)、TranslateTransform:能够让某对象的位置发生平移变化。
    (2)、RotateTransform:能够让某对象产生旋转变化,根据中心点进行顺时针旋转或逆时针旋转。
    (3)、ScaleTransform:能够让某对象产生缩放变化。
    (4)、SkewTransform:能够让某对象产生扭曲(斜角)变化。
    (5)、TransformGroup:变换集合,能够让某对象的缩放、旋转、扭曲等变化效果合并起来使用(组合多个变换)。
    (6)、MatrixTransform:能够让某对象通过矩阵算法实现更为复杂的变形。
    变形元素包括平移变形、旋转变形、缩放变形、扭曲变形、矩阵变形和组合变形元素,
    变形特效常用于在不改变对象本身构成的情况下,使对象产生变形效果,所以变形元素
    常辅助产生Silverlight中的各种动画效果。
    2.(1)、 TranslateTransform(平移变化),包含X、Y 两种属性,以原来的对象为坐标原点(0,0),然后向X轴、Y轴进行平移变换。
    在这里插入图片描述
    (2)、RotateTransform((旋转变化),包括属性Angle(旋转角度),CenterX、CenterY(旋转的中心),负数为逆时针旋转,正数为顺时针旋转。
    在这里插入图片描述
    (3)、ScaleTransform:能够让某对象产生缩放变化,包括属性ScaleX、ScaleY、CenterX、CenterY,其中ScaleX、ScaleY属性表示对象在X、Y轴进行缩放的倍数,使用CenterX 和 CenterY属性指定一个中心点,ScaleX控制的是水平方向的缩放,ScaleY控制的是垂直方向的缩放。
    在这里插入图片描述
    (4)、SkewTransform:能够让某对象产生扭曲(斜角)变化,包括属性AngleX、AngleY、CenterX、CenterY。其中使用AngleX让元素相对X轴倾斜角度,AngleY是让元素围绕Y轴的倾斜角度。同样CenterX和CenterY是中心点位置。
    在这里插入图片描述
    (5)、TransformGroup:变换集合,能够让某对象的缩放、旋转、扭曲等变化效果合并起来使用(组合多个变换),类似于在控件布局中的StackPanel内嵌的作用,是把多种变化元素组合成一种变化的容器。
    2.(1)、MatrixTransform是通过一种矩阵算法来进行运算得到相应的变形的效果的,在二维 x-y 平面中,使用3x3 矩阵进行变换,矩阵中第三列的值是固定不变的!最后一行中的成员 OffsetX OffsetY 表示转换值。方法和属性通常将变换矩阵指定为只有六个成员的矢量;成员如下:(M11, M12, M21, M22, OffsetX, OffsetY)。
    (2)、M11表示第一行第一列,m11:第一行和第一列相交处的值 Matrix,默认值为 1、M12:第一行和第二列相交处的值 Matrix,默认值为 0、M21:第二行和第一列相交处的值 Matrix,默认值为 0/M22:第二行和第二列相交处的值 Matrix,默认值为 1、offsetX:第三行和第一列相交处的值 Matrix,默认值为 0、offsetY:第三行和第二列相交处的值 Matrix,默认值为 0、以上六个属性值都是System.Double类型。

    展开全文
  • WPF动画

    2019-07-04 09:23:17
    在System.Windows.Media.Animation名称空间中将发现以下内容:7个“类型名+Animation类”这些类使用插值动画;22个“类型名+AnimationUsingKeyFrames”这些类使用关键帧动画;3个“类型名+AnimationUsingPath”类这...
  • WPF命名空间

    2020-12-18 21:39:32
    如下WPF在默认情况下带有三个命名空间。第一个通过链接的方式将命名空间加进来,是矢量的命名空间;第二个命名空间带有x的前缀,是xaml的命名空间。一个完整的XAML页面必须带有这两个命名空间。三个命名空间带有...
  • 基于WPF框架—动画

    2019-12-22 15:47:46
    WPF提供了一个更高级的模型,通过该模型可以只关注动画的定义,而不必考虑它们的渲染方式。这个模型基于依赖项属性基础架构。本质上,WPF动画只不过是在一段时间间隔内修染方式。这个模型基于依赖项属性基础架构。...
  • wpf 移动动画

    2018-08-19 15:57:00
    wpf 移动动画 private void moveTo(Point deskPoint, Control ell, double space) //deskPoint: 控件要移动到的位置 , ell :你要移动的空间 , space : 设置移动的时间片(关系到控件移动的速度)...
  • WPF路径动画

    千次阅读 2019-02-24 08:49:25
    WPF中实现动画并不是什么困难的事,因为WPF提供了动画模型和强大的类库,其中WPF中的三种基本动画:线插性值动画、关键帧动画、路径动画,这三种动画都在system.Windows.Media.Animation这个命名空间。 路径动画...
  • WPF给控件添加运动动画

    千次阅读 2019-01-20 19:26:39
    在开发的项目,有的时候需要将某些控件进行隐藏,以及隐藏后在展示出来!我们首先想到的就是控件本身的属性...在WPF中,我们可以有多种方式实现这一效果! 1、新建一个空白的wpf窗体 2、向该窗体中添加一个b...
  • WPF实现动画——旋转

    2020-05-17 17:57:48
    WPF实现动画——旋转 1、布局 布局为Canvas画布 2、对象 but.Background = Brushes.LightSteelBlue;//按钮控件的背景颜色 but.Width = but.Height = 100;//按钮控件的宽高大小 xz.Children.Add(but);//将按钮控件...
  • WPF图片处理系列

    2019-12-19 17:29:05
    1,显示图片# Image控件展示 Xaml代码: Copy <Image source="/Resources/Images/1.png"/> 缩放位图渲染算法 Xaml代码: Copy <Image Source="/Resources/Images/1.jpg" ...
  • Wpf动画

    2021-10-12 18:44:29
    基本动画:WPF提供了一个更高级的模型,通过该模型可以只关注动画的定义,而不考虑它们的渲 染方式,这个模型基于依赖项属性基础架构,本质上,WPF动画只不过是在一段时间间 隔内修改依赖项属性值的一种方式。...
  • WPF动画教程实例

    2021-11-24 15:51:27
    在之前做winform中, 也做过一些动画效果, 但是整个动画都需要我们自己去编写, 利用计时器或线程去直接操作UI元素的属性, 然而在WPF中, 则是通过一种全新的基于属性的动画系统, 改变了传统的开发模式。 2.传统的方式 ...
  • WPF中的动画

    2018-08-27 16:50:00
    原文:WPF中的动画 WPF中的动画 周银辉动画无疑是WPF中最吸引人的特色之一,其可以像Flash一样平滑地播放...
  • WPF下有两种图片合成的方式,一种还是用原来C#提供的GDI+方式,命名空间是System.Drawing 和 System.Drawing.Imaging,另一种是WPF中新添加的API,命名空间是 System.Windows.Media 和 System.Windows.Media....
  • WPF动画常用三个属性

    2019-05-26 21:50:06
    WPF动画常用三个属性 开发工具与关键技术:C#,WPF 作者:刘海红 撰写时间:2019年5月20日 WPF中有很多属性,动画的属性常用的有三个,并不是说只有三个,只是用的频率比较多,所以常常会用到它们,三个属性分别是...
  • C#_WPF动画(一)

    2021-11-28 19:24:20
    WPF提供了一个更高级的模型,通过该模型可以只关注动画的定义,而不虑它们的渲 染方式,这个模型基于依赖项属性基础架构,本质上,WPF动画只不过是在一段时间间 隔内修改依赖项属性值的一种方式。不过还有另外一个...
  • 1. 要调用默认的11种Animation Easing(缓冲动画)首先需要引用System.Windows.Media.Animation命名空间; 2. 由于这11中Animation Easing(缓冲动画)都是继承自同一个基类EasingFunctionBase,所以,都有EasingMode...
  • C# (绘制)直线 C#如何直线 C#绘制直线 WPF (绘制)直线 有源代码
  • WPF保存的几何

    2017-11-22 17:52:00
    以前做winform的时候了解过画图,用Graphics在Bitmap上: Bitmap bitmap = new Bitmap(...); Graphics g = Graphics.FromImage(bitmap) 然后可以用g来draw图形 也可以通过g.CopyFromScreen来截图 通过bitmap.Save...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 4,818
精华内容 1,927
关键字:

wpf画空间图