WPF實(shí)現(xiàn)動畫效果(七)之演示圖板
WPF動畫效果系列
WPF實(shí)現(xiàn)動畫效果(二)之From/To/By 動畫
WPF實(shí)現(xiàn)動畫效果(三)之時間線(TimeLine)
WPF實(shí)現(xiàn)動畫效果(四)之緩動函數(shù)
WPF實(shí)現(xiàn)動畫效果(五)之關(guān)鍵幀動畫
正文
前面所介紹的都是單一的動畫,它只能修改單一屬性。有的時候,我們需要將一組動畫一起進(jìn)行,對于一個按鈕,我們可能有如下需求:
選擇該按鈕時,該按鈕增大并更改顏色。
單擊該按鈕時,該按鈕縮小并恢復(fù)其原始大小。
該按鈕變成禁用時,縮小且不透明度縮減到 50%。
每個操作都同時對應(yīng)進(jìn)行著兩個動畫,此時用我們就需要用到TimelineGroup了,前文介紹TimeLine的時候已經(jīng)介紹過它了,它可以將多個TimeLine封裝成一個統(tǒng)一調(diào)度。但TimeLine是一個抽象基類,我們通常使用的是它的子類演示圖板(Storyboard)。
演示圖板(Storyboard) 是一種為其所包含的時間線提供目標(biāo)信息的容器時間線。 演示圖板可以包含任意類型的 Timeline,包括其他容器時間線和動畫。
var widthAnimation = new DoubleAnimation() { To = 250, FillBehavior = FillBehavior.Stop };
var opacityAnimation = new DoubleAnimation() { From = 1, To = 0, FillBehavior = FillBehavior.Stop };
var storyBoard = new Storyboard() { Duration = TimeSpan.FromSeconds(2) };
storyBoard.Children.Add(widthAnimation);
storyBoard.Children.Add(opacityAnimation);
Storyboard.SetTargetProperty(widthAnimation, new PropertyPath("Width"));
Storyboard.SetTargetProperty(opacityAnimation, new PropertyPath("Opacity"));
storyBoard.Begin(button);這個例子簡單的演示了如何使用StoryBoard,由于Storyboard經(jīng)常使用與XAML,這里也介紹一下XAML中的寫法:
<Storyboard x:Key="storyBoard">
<DoubleAnimation Storyboard.TargetProperty="Width" To="250" FillBehavior="Stop"/>
<DoubleAnimation Storyboard.TargetProperty="Opacity" From="1" To="0" FillBehavior="Stop"/>
</Storyboard>使用方式如下:
var storyBoard = this.FindResource("storyBoard") as Storyboard;
storyBoard.Begin();控制Storyboard
前面已經(jīng)介紹過,Storyboard 像Clock方法一樣,直接封裝了Begin、 Seek、 Stop、 Pause、Resume、Remove等幾個函數(shù),在代碼中可以直接使用。另外,在XAML中,Storyboard是可以直接在觸發(fā)器中(EventTrigger、DataTrigger、Trigger)使用的,如下就是一個簡單的例子:
<Window.Resources>
<Storyboard x:Key="storyBoard">
<DoubleAnimation Storyboard.TargetName="button" Storyboard.TargetProperty="Width" To="250" FillBehavior="Stop"/>
<DoubleAnimation Storyboard.TargetName="button" Storyboard.TargetProperty="Opacity" From="1" To="0" FillBehavior="Stop"/>
</Storyboard>
</Window.Resources>
<Window.Triggers>
<EventTrigger RoutedEvent="Loaded" >
<BeginStoryboard Storyboard="{StaticResource storyBoard}" />
</EventTrigger>
</Window.Triggers>可以看到,這兒用到了一個系統(tǒng)提供的名為BeginStoryboard的TriggerAction,同樣也提供了SeekStoryboard、 StopStoryboard、 PauseStoryboard、ResumeStoryboard、RemoveStoryboard等幾個TriggerAction。一個稍微復(fù)雜點(diǎn)的例子如下:
<Window.Resources>
<Storyboard x:Key="storyBoard">
<DoubleAnimation Storyboard.TargetName="button" Storyboard.TargetProperty="Width" To="250" FillBehavior="Stop"/>
<DoubleAnimation Storyboard.TargetName="button" Storyboard.TargetProperty="Opacity" From="1" To="0" FillBehavior="Stop"/>
</Storyboard>
</Window.Resources>
<Window.Triggers>
<EventTrigger RoutedEvent="MouseEnter" >
<BeginStoryboard Name="storyBegin" Storyboard="{StaticResource storyBoard}" />
</EventTrigger>
<EventTrigger RoutedEvent="MouseLeave" >
<RemoveStoryboard BeginStoryboardName="storyBegin" />
</EventTrigger>
</Window.Triggers>另外,微軟提供的Interaction也能在XAML中執(zhí)行Storyboard的控制:
<i:Interaction.Triggers>
<i:EventTrigger EventName="MouseEnter">
<ei:ControlStoryboardAction Storyboard="{StaticResource storyBoard}" ControlStoryboardOption="Play" />
</i:EventTrigger>
<i:EventTrigger EventName="MouseLeave">
<ei:ControlStoryboardAction Storyboard="{StaticResource storyBoard}" ControlStoryboardOption="Stop" />
</i:EventTrigger>
</i:Interaction.Triggers>由于微軟的Interaction擴(kuò)展在MVVM模式下非常有用,擴(kuò)展性也非常好,這種方式很多時候更方便。關(guān)于Interaction的使用方式,請參看這篇文章:Interaction triggers in WPF
參考資料:
到此這篇關(guān)于WPF實(shí)現(xiàn)動畫效果之演示圖板的文章就介紹到這了。希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
DevExpress根據(jù)條件設(shè)置GridControl RepositoryItem是否可編輯
這篇文章主要介紹了DevExpress根據(jù)條件設(shè)置GridControl RepositoryItem是否可編輯,需要的朋友可以參考下2014-08-08
WPF實(shí)現(xiàn)類似ChatGPT逐字打印效果的示例代碼
前一段時間ChatGPT類的應(yīng)用十分火爆,這類應(yīng)用在回答用戶的問題時逐字打印輸出,像極了真人打字回復(fù)消息,本文就來利用WPF模擬一下這種逐字打印的效果吧2023-08-08
C#?Winform實(shí)現(xiàn)進(jìn)度條顯示
這篇文章主要為大家詳細(xì)介紹了C#?Winform實(shí)現(xiàn)進(jìn)度條顯示,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-07-07
將excel數(shù)據(jù)轉(zhuǎn)換成dataset示例
這篇文章主要介紹了不借助第三方插件的情況下將Excel中的數(shù)據(jù)轉(zhuǎn)換成DataSet的方法,需要的朋友可以參考下2014-02-02

