天天看點

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

繼續閱讀