DotNet关键知识点——WPF篇(六)

Style和Animation简而言之就是简便(主要基于XAML而非代码)的方式定制变化的动态的界面;而Template则是以简便重用的方式扩展和丰富界面的静态表现。

1. 样式(Style)类

属性:
Style BasedOn:样式继承
ResourceDictionary Resources:定义供样式使用的资源
SetterBaseCollection Setters:属性/事件设置器,包含一系列Setter或EventSetter
Type TargetType:样式所作用的单元的类型
TriggerCollection Triggers:包含一系列Trigger对象,用来相应属性变化

Style设置位置:
- 直接设到具体单元的FrameworkElement.Style位置,只影响该单元,违背样式的重用性。
- 直接在资源中添加,加x:Key以备需要时引用:Style=”{StaticResouce theKey}"
- 直接在资源中添加,设置TargetType,默认作用于受管辖(包括同级)的所有相应类型的单元,不需设置x:Key

Style在代码中动态设置:
- 其过程类对应XAML的层级结构。最后将Style类型赋到FrameworkElement.Style上去。
- 可将Style添加在资源中,加x:Key,然后代码中引用资源并类型转换后得到这个Style对象。

样式继承:
继承是在已有的Style基础上进行添加或修改。
继承只需用Style.BasedOn,在XAML中引用父样式资源的x:Key即可。

2. 设置器(Setters)

设置器直接加在Style标签中,也可加载Style.Setters标签中。
SetterBase – Setter
           - EventSetter
属性设置器:

将Element设置成一个通用基类(如Control),可以将样式设置到不同类型的单元上。
事件设置器:

设置器还含string TargetName属性,用以指定目标的名称,但通常这和样式重用性不符,所以不设置。

3. 触发器(Triggers)

触发器的种类:
DependencyObject – TriggerBase – Trigger                 监视属性值
                               - MultiTrigger            监视多个属性值,所有符合时触发
                               - DataTrigger             监视绑定属性值
                               - MultiDataTrigger        监视多个绑定属性值,所有符合时触发
                               - EventTrigger            事件发生时触发(可在Control.Triggers中加)
除了EventTrigger外,其余触发器必须在Style.Triggers中添加

属性触发器(Property Triggers,Trigger类型)
主要属性:
Property - 被监视的目标属性。
Value - 触发器激活的目标属性值。
TriggerActionCollection TriggerBase.EnterActions,
                                     TriggerBase.ExitActions - 包含一系列TriggerAction对象,分别在触发器激活和去活时发生。
Setters - 在触发器激活时发生的设置,设置器可以加载Trigger.Setters中,也可直接添加在Trigger中。

多属性触发器(Multi-triggers,MultiTrigger类型)
用ConditionCollection Conditions包裹一系列Condition,每个Condition含一个Property和一个Value属性

数据触发器(Data Triggers和Multi-data-triggers,DataTrigger和MultiDataTrigger类型)
数据触发器和属性触发器类似,只是数据触发器监视绑定属性,因此触发器的Property属性改为Binding属性。

事件触发器(Event Triggers,EventTrigger类型)
事件触发器用RoutedEvent属性指定监视的事件。其TriggerActionCollection  Actions属性指定一系列TriggerAction动作对象。动作对象包括一些预定义的对象,如SoundPlayerAction等,此外在Animation中广泛应用。

4. 属性值设置优先级

优先级从高到低:
- 属性系统强制限制,指属性设置值超出允许范围被系统强制设置到一个许可值。
- 动画设置。
- 本地设置,包括XAML,代码或数据绑定设置。
- TemplatedParent(模板应用对象)设置。由高到低:a)通过应用对象的触发器设置;b) 通过应用对象属性设置
- 样式Style属性的隐式设置(仅指单元的Style作为一个属性值自动套用在上级资源中定义的类型匹配的Style)
- 通过样式的的触发器设置
- 通过模板的触发器设置
- 通过样式的设置器设置
- (系统)默认样式,a) 默认样式触发器; b)默认样式设置器
- 继承设置
- 元数据

5. 动画

名空间:System.Windows.Media.Animation

三种主要类型:
- 线性动画:命名为<类型>Animation,例如DoubleAnimation
- 基于关键帧动画:命名为<类型>AnimationUsingKeyFrames,例如StringAnimationUsingKeyFrames
- 基于路径动画:命名为<类型>AnimationUsingPath,例如PointAnimationUsingPath

主要类关系:
DependencyObject – Freezable – Animatable 
                 - TriggerAction – BeginStoryboard, …

Animatable – Timeline – AnimationTimeline – DoubleAnimationBase – DoubleAnimation 
                                          - ColorAnimationBase - ColorAnimation
                                          - StringAnimationBase – StringAnimationUsingKeyFrames 
                                          - PointAnimationBase – PointAnimationUsingPath
                         - TimelineGroup – ParallelTimeline - Storyboard
                      (含一个Timeline集合)

主要的Animation和Storyboard的共有属性都在Timeline中,主要定义
动画时间:BeginTime, Duration
加减速率:Acceleration Ratio, Deccleration Ratio: 加减速过程占总时间比例
相对速率:SpeedRatio
结束行为:AutoReverse,FillBehavior(HoldEnd则保持,Stop则退到原点), RepeatBehavior

Duration设置格式: "x:x:x" (时,分,秒)
SpeedRatio:和标准执行速度的比,<1为慢于正常,>1快于正常
RepeatBehavior:Forever为永续执行;nx表示执行n次;一个Duration格式,表示执行总时间
FillBehavior:HoldEnd表示动画结束后停在最终状态(默认);Stop表示回到起始点
AutoReverse:是否倒退

线性动画的主要属性:From - 起始值(如未设起始于当前值),By - 增量, To - 终值。常用线性动画(如To设置了,By忽略)

DoubleAnimation - 线性变化值
ColorAnimation - 线性变化颜色


6. 故事板

故事板基类TimelineGroup含一个Timeline的集合TimelineCollection Children,因此故事板可以用来定义一组动画。
关联属性Storyboard.TargetName和Storyboard.TargetProperty属性用来说明受控单元及其受控属性,可以设置在故事板上,也可设置在故事板中每个具体的动画上,故事板中的动画并发执行。

7. 使用触发器启动动画

DependencyObject - TriggerAction – BeginStoryboard
                                 - ControllableStoryboardAction – PauseStoryboard, ResumeStoryboard
                                                                - SeekStoryboard
                                                                - SetStoryboardSpeedRatio
                                                                - SkipStoryboardToFill
                                                                - StopStoryboard

事件触发器的Actions中添加一个BeginStoryboard(派生自TriggerAction),BeginStoryboard含一个Storyboard的属性,即可装载故事板。

BeginStoryboard.Name和ControllableStoryboardAction.BeginStoryboardName对应故事板的名称,后者可以次引用前者创建的故事板并执行相应操作,关联的故事板操作必须在同一个触发器集合(Style.Triggers或FrameworkElement.Trigers)中

各故事板操作器有其特殊的属性:
SetStoryboardSpeedRatio有属性SpeedRatio用于为目标故事板设置全局速率。
SeekStoryboard用于定位到某个播放点,如果其Origin属性为BeginTime,则Offset为相对起始点事件;如为Duration,则Offset为相对总长的比例。

故事板触发可以通过除时间触发器外的其他触发器,如属性触发器的Trigger.EnterActions和Trigger.ExitActions。

8. 使用代码创建和启动动画

根据XAML对象描述过程在代码中进行动画对象创建和属性赋值。然后掉目标对象的UIElement.BeginAnimation(关联属性, 动画对象)启动该对象上的动画。

9. 基于关键帧动画

关键帧动画,凡有线性动画的类型均有关键帧动画,反之则不成立。
共有三种关键帧类型:
Freezable – DoubleKeyFrame – LinearDoubleKeyFrame
          - StringKeyFrame – DiscreteStringKeyFrame

关键帧一般都有KeyTime和Value两个属性。

1. 线性关键帧 - 各关键帧之间线性插值,如LinearDoubleKeyFrame
2. 离散关键帧 - 各关键帧之间没有其他帧,如DiscreteStringKeyFrame
3. 贝塞尔关键帧(Spline Key Frames) - 用贝塞尔曲线描述运动,每个帧附加一个KeySpline=”x1,y1 x2,y2”属性描述两个控制点。

各种类型关键帧(只要对象允许)可以在一个动画中混合使用。

参考资料:
[1] http://msdn.microsoft.com/library/ms743230.aspx

posted @ 2009-12-01 19:58  quanben  阅读(269)  评论(0编辑  收藏  举报