1. 程式人生 > >WPF自學—模仿QQ窗體載入和關閉動畫

WPF自學—模仿QQ窗體載入和關閉動畫

這兩天把《WPF程式設計寶典》這本書的動畫相關章節看完了,於是想寫個小程式練練手,但是不知道寫什麼好。看書的時候雖然也把上面的案例照著敲了一遍,但是它們畢竟和實際應用有很大差別,想用到日常專案裡也不知道從何下手。

剛好看到了一位網友 youngytj  分享的模仿QQ載入和關閉動畫的文章,我就跟著學習模仿了一遍,下面來講講具體如何實現的。

首先分析下我想實現的效果:第一,我開啟程式後它從上到下滾動逐漸顯示出來。第二,我點選視窗的關閉按鈕後,窗體由下而上滾動逐漸消失。

為了實現這種效果我們要把窗體的WindowStyle設為None,因為用預設窗體風格的話,動畫是執行在一個帶有邊框的框架裡面的,遠不是我們想要的效果,如下圖:

 

從上面還可以看到窗體動畫執行的時候,未填充的部分顯示黑色,這是因為窗體的AllowsTransparency屬性為false的緣故。我們把AllowsTransparency設為true以後,窗體的工作區支援透明瞭,就不會有黑色出現了。

接下來我們要給窗體設定一個背景,這樣執行才能看到效果,我設的背景是一個漸變畫刷,上面是淺藍色,下面是白色,程式碼如下:

<Style TargetType="Window" x:Key="MyWindowStyle">

        <Setter Property="Background">

            <Setter.Value>

                <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">

                    <GradientStop Color="#428AC7" Offset="0"/>

                    <GradientStop Color="White" Offset="1"/>

                </LinearGradientBrush>

            </Setter.Value>

        </Setter>

</Style>

建議:為了規範點,我建立了一個資源字典MainResourceDictionary:本示例的所有樣式是放在這裡面的。

背景新增完以後我們需要給窗體新增一個透明掩碼和展開、合併的動畫,這也是本示例的關鍵部分。動畫改變的就是這個透明掩碼的偏移值和偏移的顏色。透明掩碼如下:

<Window.OpacityMask>

        <LinearGradientBrush StartPoint="0,0" EndPoint="0,1">

            <GradientStop Offset="0" Color="Transparent"></GradientStop>

            <GradientStop Offset="0" Color="Yellow"></GradientStop>

        </LinearGradientBrush>

</Window.OpacityMask>

這個透明掩碼也是一個漸變畫刷組成的,它實現的是從上到下的垂直漸變。我自己測試之後發現,這個漸變畫刷最關鍵的部分是指定第一個顏色為透明色,至於後面一種顏色設定成什麼都無所謂,不知道為什麼會這樣。(因為是新手,我現在還只是“知其然”的階段,如果哪位大神知道原因還請不吝賜教。)

動畫的程式碼如下:

<Window.Resources>

        <Storyboard x:Key="zhankai">

            <DoubleAnimation From="0" To="1" Duration="0:0:0.5"

                                 Storyboard.TargetName="MyWindow"

                                 Storyboard.TargetProperty="(UIElement.OpacityMask).(GradientBrush.GradientStops)[0].Offset"/>

            <DoubleAnimation From="0" To="1" BeginTime="0:0:0.1" Duration="0:0:0.4"

                                 Storyboard.TargetName="MyWindow"

                                 Storyboard.TargetProperty="(UIElement.OpacityMask).(GradientBrush.GradientStops)[1].Offset"/>

            <ColorAnimation BeginTime="0:0:0.5" Duration="0:0:0" From="Transparent" To="Yellow" Storyboard.TargetName="MyWindow"

                                 Storyboard.TargetProperty="(UIElement.OpacityMask).(GradientBrush.GradientStops)[0].Color"/>

        </Storyboard>

        <Storyboard x:Key="hebing" Completed="Storyboard_Completed">

            <DoubleAnimation From="1" To="0" Duration="0:0:0.4"

                                 Storyboard.TargetName="MyWindow"

                                 Storyboard.TargetProperty="(UIElement.OpacityMask).(GradientBrush.GradientStops)[0].Offset"/>

            <DoubleAnimation Duration="0:0:.3" BeginTime="0:0:0.1" From="1" To="0"

                                 Storyboard.TargetName="MyWindow"

                                 Storyboard.TargetProperty="(UIElement.OpacityMask).(GradientBrush.GradientStops)[1].Offset"/>

            <ColorAnimation Duration="0" From="Yellow" To="Transparent" Storyboard.TargetName="MyWindow"

                                 Storyboard.TargetProperty="(UIElement.OpacityMask).(GradientBrush.GradientStops)[1].Color"/>

        </Storyboard>

    </Window.Resources> 

動畫新增完以後我們需要在事件觸發器裡呼叫它們,具體是哪兩個事件呢?

我一開始想的是在Window.Loaded呼叫展開動畫,在Button.Click事件裡呼叫關閉動畫,但是在展開的時候有一個問題。那就是Window.Loaded事件是載入完以後才執行的,這時候才呼叫動畫給人的感覺就是窗體先彈出來,然後再回頭由上而下逐漸滾動顯示出來,這就有點凌亂了。

所以還是按照youngytj的方法,在窗體的建構函式裡呼叫,這樣就實現了從無到有逐漸顯示的效果,程式碼如下:

 Storyboard storyBoard =(System.Windows.Media.Animation.Storyboard)MyWindow.Resources["zhankai"];
 if (storyBoard != null)
 {
     storyBoard.Begin();
 }

 

關閉動畫我們還是在Xaml裡呼叫,程式碼如下:

<Window.Triggers>

        <EventTrigger RoutedEvent="Button.Click">

            <BeginStoryboard Storyboard="{StaticResource hebing}"></BeginStoryboard>

        </EventTrigger>

</Window.Triggers>

現在基本上就實現了我們要的效果了,如下圖:

 

以上就是全部的實現了,整體來說也沒有什麼難點。但我覺得對於我們新手來說最大的問題不是如何實現出這樣的動畫,而是大腦當中如何設計出這樣的動畫。比如我是看了youngytj 的文章才知道這個動畫的原理,如果憑空讓我設計其他動畫的話我還是不知道如何下手,這是最頭疼的,還是繼續努力學習吧,爭取早點脫離這種“只知其然而不知其所以然”的階段。

原始碼已經上傳,感興趣的朋友可以去下載:

相關推薦

WPF自學模仿QQ窗體載入關閉動畫

這兩天把《WPF程式設計寶典》這本書的動畫相關章節看完了,於是想寫個小程式練練手,但是不知道寫什麼好。看書的時候雖然也把上面的案例照著敲了一遍,但是它們畢竟和實際應用有很大差別,想用到日常專案裡也不知道從何下手。 剛好看到了一位網友 youngytj  分享的模仿QQ載入和

Android 書本開啟關閉動畫

作者: Jooyer, 時間: 2018.12.08 Github地址,歡迎點贊,fork 我偶爾一次發現掌閱的開啟書本動畫不錯,然後度娘了一下,發現一個連結:download.csdn.net/download/we… , 下載下來學習膜拜了一下,發現有些動畫過度和掌閱有點不一樣,所以

WPF窗體動畫顯示關閉

在WindowsForm中可以利用WindowsApi函式AnimateWindow(Inptr hwd,int dwTime,int dwFlags)實現窗體的動畫顯示和淡出,但是它的樣式十分少,且效果不好,而WPF引入了動畫以後,可以自定義很炫的動畫,增強了程式的視

WPF的消息機制(三)- WPF內部的5個窗口之處理激活關閉的消息窗口以及系統資源通知窗口

session 改變 可用 輸入 follow 而是 wpf sdn order 原文:WPF的消息機制(三)- WPF內部的5個窗口之處理激活和關閉的消息窗口以及系統資源通知窗口 版權聲明:本文為博主原創文章,未經博主允許不得轉載。

WPF的訊息機制(三)- WPF內部的5個視窗之處理啟用關閉的訊息視窗以及系統資源通知視窗

原文: WPF的訊息機制(三)- WPF內部的5個視窗之處理啟用和關閉的訊息視窗以及系統資源通知視窗 目錄 WPF的訊息機制(一)-讓應用程式動起來 WPF的訊息機制(二)-WPF內部的5個視窗 (1)隱藏訊息視窗 (2)處理啟用和關閉的訊息視窗和系統資源通知視窗

hibernate延遲載入session關閉問題

1.關閉延遲載入特性 2.在session關閉之前先獲取需要查詢的資料,可以使用工具方法Hibernate.isInitialized()判斷物件是否被載入,如果沒有被載入則可以使用Hibernate.initialize()方法載入物件。 使用攔截器或過濾器延長Session的生命週期直到

【EfF】 貪婪載入延遲載入 (virtual去掉關閉延遲載入) EntityFramework(EF)貪婪載入延遲載入的選擇使用

EntityFramework(EF)貪婪載入和延遲載入的選擇和使用 貪婪載入:顧名思議就是把所有要載入的東西一 次性讀取 1 using (var context = new MyDbContext()) 2 { 3 var orders = from o in context.Or

WPF入門之WPF載入編譯xaml

環境:vs2013 雖然WPF中主要使用xaml來寫介面,但是程式依然可以脫離xaml而獨自執行,下面說明使用三種不同的編碼方式來建立WPF應用程式: 1.只使用程式碼 這種方式比較極端,但也存在優勢。 程式碼示例:新建一個wpf應用程式,將工程中的xaml檔案以及xam

WPF 下無邊框窗體改變大小移動

       最近一直在學習 WPF,看著別人做的WPF程式那麼漂亮,眼紅啊~ 很多漂亮的程式都是無邊框的。於是無邊框視窗操作就是最重要的了。無邊框視窗的操作一直以來相關的資料就很少。WPF 下的就更少了,有的大多是無邊框窗體的移動。在得到群裡高人的指點,再查了一些資料之

WPF中隱藏視窗最小化、最大化關閉按鈕

        private const int GWL_STYLE = -16;         private const int WS_SYSMENU = 0x80000;         [System.Runtime.InteropServices.DllImport("user32.dll",

wpf 在mvvm模式下通過命令關閉窗體

我們知道通過註冊事件直接可以在後臺用this.Close();方法進行直接關閉窗體。但是當我們用了mvvm 模式後,程式碼的分層和規範讓我們不好再用傳統的方式進行關閉視窗,那麼在mvvm 下我們如何通過命令的方式下關閉視窗呢? 利用View裡的IsEnable屬性。

WebBrowser控制元件應用:彈出新窗體關閉視窗

緣起:上次寫了一個《WebBrowser控制元件的簡單應用2》,提到了在NewWindow事件中開啟新視窗的例子。有網友“隊長 ”提出那個事件得到的引數是本頁面的,而不是新頁面的,經過測試,果然url引數不是新頁面的。 Open新頁面要處理的: 1:<<a href=’xxxxx’ target

使用c#,WPF模仿IPhone的Loading(載入)效果

剛開始用IPhone的時候,每當看到Loading畫面,就覺著這效果不錯,簡潔時尚,印象深刻。 某天在專案中碰到要作一個Loading效果,突然想到了IPhone的效果,雖然把這個效果做成GIF是一種明智的選擇,但出於好奇想著用程式碼給寫出來。 下面是從手機上截到的圖

win10電腦突然開不了熱點,怎麽辦,怎樣開啟關閉此操作??

開啟 右擊 禁用 設備管理 選擇 src blog log 設備 (1)右擊‘我的電腦’,選擇‘管理’ 會出現下面這個界面 (2)選擇‘設備管理器’,再右擊‘網絡適配器’裏面的第二條,具體如下圖示 (3)選擇‘屬性’,進入‘高級’選項有下圖所示界面 (4)再將鼠

C#—Dev XtraTabControl動態增加Tab關閉選項卡方法

按鈕 屬性 bool new express controls dispose lean 選中 C#—Dev XtraTabControl動態增加Tab和關閉選項卡方法,有需要的朋友可以參考下。 記錄一下以免以後忘了 添加using DevExpress.XtraTab;

linux後臺運行關閉、查看後臺任務

ctrl+z ctrl+c .com nat 執行 opp 後臺進程 查看 用戶 fg、bg、jobs、&、nohup、ctrl+z、ctrl+c 命令 一、& 加在一個命令的最後,可以把這個命令放到後臺執行,如 watch -n 10 sh

mysql啟動關閉外鍵約束的方法

word nbsp 查看 set 外鍵約束 mysql 輸入 check select 關閉外鍵約束,輸入命令:SET FOREIGN_KEY_CHECKS=0; 啟動外鍵約束,輸入命令:SET FOREIGN_KEY_CHECKS=1; 查看當前是否有外鍵約束:SELEC

Oracle啟動關閉

命令 fuse 在線 數據庫系統 .exe ssi 建立 use 控制文件 1 數據庫啟動 1.1 需要的權限 SYSDBA或者SYSOPER系統權限。 1.2 啟動的方法 SQL*Plus STARTUP command Oracle Enterprise

全文檢索ES 服務啟動關閉

eap sep ror cms nco sin head exp rac nohup ./elasticsearch & 可以後臺開啟elasticsearch服務 ps-ef列出所有進程 ps-ef | grep elastic...查找elastic。。的

Unity載入內存管理機制

return for edas img 技術 lte dal cto 變量 Unity幾種動態載入Prefab方式的差異: 事實上存在3種載入prefab的方式: 一是靜態引用,建一個public的變量,在Inspector裏把prefab拉上去,用的時候ins