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