アニメーションの完了時にFrameworkElementsを削除します
-
13-09-2019 - |
質問
私はセルズ/グリフィス 『プログラミングWPF』を通じてWPF自分自身を教えてきた、と私はそれを素晴らしいリソースを見つけたが、私は彼らが私を導入しました概念のいくつかを取ると行くことにしようとしていますさらなるステップ、と私は私が何をしようとしている達成するために一緒に作品を置く方法についての概念思わぬ障害に実行しています。
この演習では、私は自己終結アニメーションを作成しようとしています。イベントによって作成されFrameworkElement
sは、アニメーションを実行し、自分自身を削除します。私はanimation.Completedイベントから親FrameworkElement
にコールバックする方法を考え出すの問題を抱えている。
私はもともとただDoubleAnimation
の一部非包含していなかったStoryboard
sを使用してこの質問をしました。私は以来、Storyboard
を追加し、それらを簡単に再利用できるようにStoryboard
と長方形のリソースを行いました。
ここで私がこれまで持っているものです。
.xamlます:
<Window.Resources>
<Storyboard x:Key="GrowSquare" x:Shared="False">
<DoubleAnimation Storyboard.TargetProperty="(Canvas.Top)" By="-50" Duration="0:0:2"/>
<DoubleAnimation Storyboard.TargetProperty="(Canvas.Left)" By="-50" Duration="0:0:2"/>
<DoubleAnimation Storyboard.TargetProperty="(Ellipse.Width)" By="100" Duration="0:0:2"/>
<DoubleAnimation Storyboard.TargetProperty="(Ellipse.Height)" By="100" Duration="0:0:2"/>
</Storyboard>
<Rectangle x:Key="MyRect" x:Shared="False" Width="20" Height="20">
</Rectangle>
</Window.Resources>
<Canvas x:Name="myCanvas" MouseMove="myCanvas_MouseMove" Background="White"/>
は.csます:
public partial class Window1 : Window
{
public Window1()
{
InitializeComponent();
lastFire = DateTime.Now;
}
DateTime lastFire;
private void myCanvas_MouseMove(object sender, MouseEventArgs e)
{
DateTime nowTime = DateTime.Now;
TimeSpan T = nowTime.Subtract(lastFire);
if (T.TotalMilliseconds > 200)
{
lastFire = nowTime;
Random Rand = new Random();
Rectangle myRect = (Rectangle)FindResource("MyRect");
myRect.Fill = new SolidColorBrush(Color.FromRgb((byte)Rand.Next(256), (byte)Rand.Next(256), (byte)Rand.Next(256)));
Point myLoc = e.GetPosition(myCanvas);
Canvas.SetLeft(myRect, myLoc.X - 10);
Canvas.SetTop(myRect, myLoc.Y - 10);
myCanvas.Children.Add(myRect);
Storyboard SB = (Storyboard)FindResource("GrowSquare");
SB.Completed += new EventHandler(SB_Completed);
SB.Begin(myRect);
}
}
void SB_Completed(object sender, EventArgs e)
{
myCanvas.Children.RemoveAt(0);
}
}
これは動作しますが、方法で、私はそれをたいと思いません。キャンバスは空で、すべてのアニメーションが同じ長さなので、アニメーションが完了したとき、それは常にキャンバスの最初の子に呼び出されたものになります。
しかし、私はアニメーションが常に起動して、同じ順序で終わらないことを意味し、ランダムな時間がかかるanimaitonsを実装したいと思います。どういうわけかSB_Completedイベントで、私はそれは時に呼び出されたコントロールにアクセスしたいのですが、私はまだそれへのパスを見つけるように見えることはできません。
アニメーションが上で呼び出されていることを制御するSB_Completedイベントを呼び出しますMedia.Animation.ClockGroupから取得する方法はありますか?
解決
あなたはこれにイベントハンドラを割り当てる行を変更します:
SB.Completed += (s,e) => myCanvas.Children.Remove(myRect);