先看一段代碼,本文所有的例子,都是在這段代碼的基礎上進行的. 一個矩形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
歡迎大神,萌新踴躍加入,交流探討,共同進步!