學習平台
微軟開發者部落格:
微軟文件與學習:
微軟開發者平台:
在之前做winform中, 也做過一些動畫效果, 但是整個動畫都需要我們自己去編寫, 利用計時器或執行緒去直接操作ui元素的屬性, 然而在wpf中, 則是通過一種全新的基於屬性的動畫系統, 改變了傳統的開發模式。
(1).建立乙個週期性觸發的定時器(例如, 間隔50毫秒的重新整理動作)
(2).當每次出發計時器時, 關聯的事件處理程式會執行一些與介面ui元素相關的細節。(例如,改變窗體的大小)
(3).重新繪製整個介面元素。
缺點:1.修改乙個效果的時候,要比想象中複雜, 你要追加乙個效果,必須編寫所有的**, 甚至變得更加複雜。
2.動畫的幀率固定, 然後渲染基於基礎的gdi+繪圖, 並不支援顯示卡級別的渲染模式。
3.複雜的動畫需要更複雜的**實現, 不僅開發難, 維護更難。
在wpf中, 動畫使用了乙個完全不同的模型。本質上, wpf動畫只不過是在一段時間間隔內修改依賴性
屬性值的一種方式。
優點:1.一套完整的動畫封裝, system.windows.media.animation空間下已經提供了多數動畫類。
2.完成不同的特效, 只需要微調部分屬性即可。
3.支援硬體加速。
正如上面所說, 每乙個動畫依賴於乙個依賴項屬性。原理則是通過修改其屬性值到達效果。
wpf所有的動畫類中, 都繼承於animatable , 該抽象類提供動畫支援 , 具體看如下:
微軟官方文件連線
類圖如下所示:
gif效果圖, 演示可以兩個動畫, 乙個在窗體載入時向上下張開, 乙個關閉時上下向中間收縮動畫。
1.建立 storyboard 物件, 用於裝配子動畫物件和屬性資訊。
2.由於控制margin, 用到的屬於 thickness 結構的資料型別, 所以需要建立 thicknessanimation 物件。
3.設定 thicknessanimation 其子屬性的引數: 動畫時間、 初始值、結束值。
4.繫結其元素物件gridmain
5.繫結依賴屬性 margin
6.新增到 storyboard 容器中
7.執行動畫
system.windows.media.animation.storyboard sb = new system.windows.me
system.windows.media.animation.thicknessanimation dmargin = new system.windows.media.animation.thicknessanimation();
dmargin.duration = new timespan(0, 0, 0, 0, 300);
dmargin.from = new thickness(0, 300, 0, 300);
dmargin.to = new thickness(0, 0, 0, 0);
system.windows.media.animation.storyboard.settarget(dmargin, gridmain);
system.windows.media.animation.storyboard.settargetproperty(dmargin, new propertypath("margin", new object ));
sb.children.add(dmargin);
程式設計客棧 sb.begin();
注: gridmain實際為xmal中 grid窗體的 name="gridmain"
.duration
duration屬性很簡單, 它就是在動畫開始時刻和結束時刻之間的時間間隔(時間間隔單位以毫秒、分鐘、小時或者其他喜歡使用的任何單位)。duration和timespan非常類似, 並且duration結構定義了乙個隱式轉換,能夠根據需要將system.timespan轉為system.windows.duration。
這正是為什麼下面的**完全可以和上面的一樣使用:
dmargin.duration = new duration(new timespan(0, 0, 0, 0, 300));
.from
from屬性用於設定初始值, 例如上例中,margin設定為上下邊距為300.
.toto屬性用於設定動畫結束的值。如上中, 結束動畫完成, grid的邊距則為0.
1.相對於**建立動畫, xaml方式建立動畫要簡單的多。新增 storyboard鍵 , 然後新增 thicknessanimation鍵和繫結引數
zhgerwczba
2.利用時間觸發器, 關聯啟動事件, 進行動畫的載入。
剩餘部分:
關閉部分動畫的收縮**實現:
system.windows.media.animation.thicknessanimation dmargin = new system.windows.media.animation.thicknessanimation();
dmargin.duration = new duration(new timespan(0, 0, 0, 0, 300));
dmargin.from = gridmain.margin;
dmargin.to = new thickness(0, 300, 0, 300);
system.windows.media.animation.storyboard.settarget(dmargin, gridmain);
system.windows.media.animation.storyboard.settargetproperty(dmargin, new propertypath("margin", new object ));
sb.children.add(dmargin);
前台xaml**的實現方式, 關閉的事件中, 繫結的textblock.mouseleftbuttondown 事件, 完整**(包含上面部分):
>
zhgerwczbaproperty="margin" completed="sb_completed"/>
本文標題: wpf實現動畫效果
本文位址:
WPF實現射線效果動畫
最近的乙個專案中有個需求是 從乙個點向其它多個點發出射線,要求這些射線同時發出,同時到達。我就想到了用wpf的動畫來實現。wpf中有line類用於繪製直線,但這個類中好像沒有這樣的方法能直接滿足需求,只能自己寫乙個方法 我對wpf也只是剛入門,不確定是否有這樣的方法 射線可以看作乙個起點不變而終點一...
WPF 實現水紋效果
原文 wpf 實現水紋效果 滑鼠滑過產生水紋,效果圖如下 xmal就放置了乙個img標籤 後台主要 窗體載入 private void window loaded object sender,routedeventargs e 計時器 public void tobindtimerevent tim...
WPF實現漸變淡入淡出的動畫效果
原文 wpf實現漸變淡入淡出的動畫效果 1.1 利用uielement.opacitymask屬性,用於改變物件區域的不透明度的畫筆。可以使元素的特定區域透明或部分透明,從而實現比較新穎的效果。1.2 opacitymask屬性接受任何畫刷,可利用lineargradientbrush線性漸變畫刷,...