TranslateTransform3D tt3d = new TranslateTransform3D(new Vector3D(0, 0, 0)); DoubleAnimation da = new DoubleAnimation(-4, new Duration(TimeSpan.FromSeconds(1))); tt3d.BeginAnimation(TranslateTransform3D.OffsetYProperty, da); 我們使用一個0矢量創建一個平移。動畫在經過一段時間后會改變平移;所以,我們不需要把該矢量設置為其它非0值。實際動畫使用一個值和一個時限(TimeSpan)值。在這種情況中,我想每秒移動-4單位。BeginAnimation調用指示,我想沿哪個軸移動這-4單位-在此是沿著Y軸。實際實現的是,把字母往下移動4個單位,這將耗費一秒鐘。
double oldX = double.Parse(str[1]); double newX = (_CurrGuess.Length + 1) * -2.5; TranslateTransform3D tt3d2 = new TranslateTransform3D(new Vector3D(0, 0, 0)); da = new DoubleAnimation(newX - oldX, new Duration(TimeSpan.FromSeconds(1))); tt3d2.BeginAnimation(TranslateTransform3D.OffsetXProperty, da); 這里的執行非常相似于上面情況,只是要確定要移動多少單位和沿什么軸移動。因此,讓我們繼續討論更令人感愛好的旋轉變換:
RotateTransform3D myRotateTransform = new RotateTransform3D( new AxisAngleRotation3D(new Vector3D(1, 0, 0), 1)); DoubleAnimation myAnimation = new DoubleAnimation(); myAnimation.From = 0; myAnimation.To = 360; myAnimation.Duration = new Duration(TimeSpan.FromMilliseconds(1000)); myAnimation.RepeatBehavior = new RepeatBehavior(1); myRotateTransform.Rotation.BeginAnimation(AxisAngleRotation3D.AngleProperty, myAnimation); 我們沿一個軸實現旋轉。上面的矢量指示,它位于X軸上。AxisAngleRotation3D構造函數的第二個參數是一個角度值(為1)。該動畫每次運動1度,這很輕易理解。我使動畫從第0幀(相應于0度)移動到第360幀(相應于360度)。我還想使其它一切都在一秒內完成。
現在,最后一步是把所有變換施加到hitgeo對象:
(hitgeo.Transform as Transform3DGroup).Children.Insert(1, myRotateTransform); (hitgeo.Transform as Transform3DGroup).Children.Add(tt3d); (hitgeo.Transform as Transform3DGroup).Children.Add(tt3d2); 代碼看上去有點希奇,但是為了實現多種變換,你必須把字母的Transform屬性賦值為一個Transform3DGroup(其實,這是相應于一組變換)。我是在創建字母時實現這一點的,我想保留對字母施加的原始變換并且再添加上一些新的變換。
FormattedText ft = new FormattedText(text, new CultureInfo("en-us"), FlowDirection.LeftToRight, new Typeface(new FontFamily("Arial"), FontStyles.Normal, FontWeights.Normal, new FontStretch()), 24D, Brushes.Black); 注重,這里的text變量中存儲著我想編寫的文本。我選擇使用黑色Arial,24pt字體。這基本上確定了一個文本框,并且能夠相應于文本大小來調整該文本框大小。我可以使用這個尺寸來決定我想如何縮放我的按鈕的尺寸。你會在ButtonFactory的實現代碼中看到類似如下的內容: