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