對後臺代碼寫動畫 出現的一些怪異行為 的總結

来源:http://www.cnblogs.com/tsliwei/archive/2016/07/18/5681763.html
-Advertisement-
Play Games

先看一段代碼,本文所有的例子,都是在這段代碼的基礎上進行的. 一個矩形rec,放到佈局容器內,這個矩形就是被動畫控制的對象,一個double類型的動畫. 以前我後臺寫動畫,都是通過先給對象註冊名稱,通過名稱,把對象(Rectangle)和動畫(DoubleAnimation)通過Storyboard ...


先看一段代碼,本文所有的例子,都是在這段代碼的基礎上進行的.

一個矩形rec,放到佈局容器內,這個矩形就是被動畫控制的對象,一個double類型的動畫.

 

以前我後臺寫動畫,都是通過先給對象註冊名稱,通過名稱,把對象(Rectangle)和動畫(DoubleAnimation)通過Storyboard.SetTargetName()關聯到故事版(Storyboard).

例:給矩形加一個TranslateTransform,通過控制X屬性,使矩形水平位移

這種方式,動畫可以動起來.註意最後的Begin()方法,一定要傳一個參數,可以是window(this),可以是佈局容器Layout,也可以是矩形自身rec.總之一定要傳一個參數,不然動畫動不起來.

至於為什麼,不知道.去查閱MSDN,無果. https://msdn.microsoft.com/zh-cn/library/cc190590(v=vs.95).aspx

還有一個問題是,如果想對動畫進行後續操作,要傳入第二個參數為True.(感謝@ligl007的提醒) sb.Begin(this, true),否則對動畫進行的暫定,繼續,停止等後續操作全部無效.調用移除方法Remove(),也不能觸發Completed事件.

 

為瞭解決這個問題,做了幾種情況的總結.

最終的結果都是使用Storyboard.SetTarget()方法代替Storyboard.SetTargetName(),這樣能避免給對象註冊無意義的Name,Begin()方法不傳參數.這樣就能進行暫定,繼續,停止等後續操作了,調用移除方法Remove()時,能夠觸發Completed事件.

1.改變對象的值類型的依賴屬性,如Width,Height等,直接把註冊名稱換成註冊對象就可以,其他沒什麼變化

2.改變對象的引用類型的依賴屬性,如轉換RenderTransform等,對象要註冊矩形rec而不是TranslateTransform,屬性路徑要按屬性路徑語法寫,而不是new PropertyPath(TranslateTransform.XProperty).可以理解成矩形並沒有TranslateTransform.XProperty屬性.

屬性路徑語法請參考: https://msdn.microsoft.com/zh-cn/library/cc645024(v=vs.95).aspx

3.同2,只不過把轉換換成了轉換組,重點看屬性路徑語法,這個語法MSDN並沒有提到,我是通過試錯,試出來的,這個語法很嚴格,多個或少個括弧,括弧換個位置,都不行

完畢,貼出可以複製的代碼吧

 

 1 private Storyboard m_sb;
 2 
 3         private void Window_Loaded(object sender, RoutedEventArgs e)
 4         {
 5             m_sb = Test();
 6         }
 7 
 8         private void Button_Click(object sender, RoutedEventArgs e)
 9         {
10             m_sb.Remove(this);
11         }
12 
13         private Storyboard Test()
14         {
15             Rectangle rec = new Rectangle() { Width = 50, Height = 50 };
16             rec.Fill = new SolidColorBrush(Color.FromRgb(255, 0, 0));
17             Layout.Children.Add(rec);
18 
19             DoubleAnimation da = new DoubleAnimation();
20             da.Duration = new Duration(TimeSpan.FromSeconds(2));
21             da.From = 200;
22             da.To = 50;
23             da.RepeatBehavior = RepeatBehavior.Forever;
24             da.AutoReverse = true;
25 
26             //註冊名稱方式
27             //可以動 但Storyboard的Begin()要傳一個參數,可以傳this或父級 如需做後續操作 需要把Begin()的第二個參數設置為true
28             TranslateTransform tTf = new TranslateTransform();
29             rec.RenderTransform = tTf;
30             //名稱不能以數字開頭,不能包含"-"
31             string name = "tTf" + Guid.NewGuid().ToString().Replace("-", "");
32             this.RegisterName(name, tTf);
33             Storyboard.SetTargetName(da, name);
34             Storyboard.SetTargetProperty(da, new PropertyPath(TranslateTransform.XProperty));
35             Storyboard sb = new Storyboard();
36             sb.Completed += sb_Completed;
37             sb.Children.Add(da);
38             sb.Begin(this, true);
39             return sb;
40 
41             ////1.改變對象的值類型的依賴屬性
42             ////有效
43             //Storyboard.SetTarget(da, rec);//通過名稱註冊換成通過對象註冊
44             //Storyboard.SetTargetProperty(da, new PropertyPath(Rectangle.WidthProperty));
45             ////Storyboard
46             //Storyboard sb = new Storyboard();
47             //sb.Completed += sb_Completed;
48             //sb.Children.Add(da);
49             //sb.Begin();
50             //return sb;
51 
52             ////2.改變對象的引用類型的依賴屬性
53             //TranslateTransform tTf = new TranslateTransform();
54             //rec.RenderTransform = tTf;
55             //////無效
56             ////Storyboard.SetTarget(da, tTf);//轉換
57             ////Storyboard.SetTargetProperty(da, new PropertyPath(TranslateTransform.XProperty));//不按屬性路徑語法
58             //////無效
59             ////Storyboard.SetTarget(da, rec);//矩形
60             ////Storyboard.SetTargetProperty(da, new PropertyPath(TranslateTransform.XProperty));//不按屬性路徑語法
61             ////有效
62             //Storyboard.SetTarget(da, rec);//矩形
63             //Storyboard.SetTargetProperty(da, new PropertyPath("(Rectangle.RenderTransform).(TranslateTransform.X)"));//按屬性路徑語法
64             ////Storyboard
65             //Storyboard sb = new Storyboard();
66             //sb.Completed += sb_Completed;
67             //sb.Children.Add(da);
68             //sb.Begin();
69             //return sb;
70 
71             ////3.轉換組,屬性路徑語法
72             //TranslateTransform tTf = new TranslateTransform();
73             //ScaleTransform sTf = new ScaleTransform();
74             //TransformGroup tfg = new TransformGroup();
75             //tfg.Children.Add(tTf);
76             //tfg.Children.Add(sTf);
77             //rec.RenderTransform = tfg;
78             ////有效
79             //Storyboard.SetTarget(da, rec);//矩形
80             //Storyboard.SetTargetProperty(da, new PropertyPath("(Rectangle.RenderTransform).Children[0].(TranslateTransform.X)"));//按屬性路徑語法
81             ////Storyboard
82             //Storyboard sb = new Storyboard();
83             //sb.Completed += sb_Completed;
84             //sb.Children.Add(da);
85             //sb.Begin();
86             //return sb;
87         }
88 
89         void sb_Completed(object sender, EventArgs e)
90         {
91 
92         }
View Code

 

原理依然不清楚,如有大神知道,望指點

 

如果感覺此文對你有幫助,請點擊"推薦"

 

推薦一個不錯的Blend,Wpf,sl交流群

群號碼:152049269

歡迎大神,萌新踴躍加入,交流探討,共同進步!


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • find命令相對於locate這種非實時查找的搜索命令,大大增加了我們搜索的便捷度以及準確性;並且能夠方便的幫助我們對大文件、特定類型的文件查找與刪除,特別是有超多小碎文件的時候,更是方便至極.... -user username:查找屬主是xx的文件 -group group:查找屬組的xx文件 ...
  • 使用以下命令查看: ps -aux | sort -k4,4n ps auxw --sort=rss ps auxw --sort=%cpu linux 下的ps命令 %CPU 進程的cpu占用率 %MEM 進程的記憶體占用率 VSZ 進程所使用的虛存的大小 RSS 進程使用的駐留集大小或者是實際記憶體 ...
  • 1. Excel for Mac 的 Developer tab下沒有XML組,因此無法從xml導入或者導出到xml; 2. Excel for Mac 中沒有Mark as Finnal的功能; 3. Switch Window功能存在於頂部菜單 Window 中; Mac中變為: 4. ...
  • 出現這個錯誤,是系統的glibc版本太低了,需要更新 到http://ftp.gnu.org/gnu/glibc/下載新版本的glibc,也不用太高,我選擇glibc-2.20.tar.gz 解壓完畢後 ./congigure --prefix=/opt/glibc-2.20 make && mak ...
  • 前些天公司項目需要對上傳的圖片打水印,前端採用angularjs,後端nodejs,網上一搜,找到了一個images的庫,在本地Windows環境下試了下還不錯,然後就上傳測試伺服器(centos6.5系統)了,結果就出問題了,網上一查,發現需要gblic2.14(centos6.5系統自帶的是2. ...
  • 但是對於在各個 IT 領域的人們,我們需要將這個事情提高一個層面。我們需要使用像 SSH 密鑰這樣的加密秘鑰,而不只是密碼。 設想一個場景:我有一個運行在雲上的伺服器,用作我的主 git 庫。我有很多台工作電腦,所有這些電腦都需要登錄到這個中央伺服器去做 push 與 pull 操作。這裡我設置 g ...
  • 設計界面: 代碼: using System; using System.Collections.Generic; using System.ComponentModel; using System.Drawing; using System.Data; using System.Linq; usi ...
  • 前幾天,領導讓我找一下老系統(Java)里getRemoteUser方法都哪個文件用了,package是什麼,方法被調用了多少次,當時因為著急,所以,直接人工找的,但是以後要是再出現,人工找就太討厭了,畢竟程式員以懶著稱,因此,寫了一個小工具進行查詢。 一、效果圖 從圖中不難看出,現在的功能只能查詢 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...