我一直在通过 Sells/Griffiths 的“Programming WPF”自学 WPF,我发现它是一个很好的资源,但我正在尝试采用他们向我介绍的一些概念并开始更进一步,我遇到了关于如何将各个部分组合在一起以完成我想要做的事情的概念障碍。
在这个练习中,我尝试创建 self 终止的动画; FrameworkElement
由 Events 创建,执行动画,然后自行删除。我在弄清楚如何从 animation.Completed 事件回调父 FrameworkElement
时遇到问题。
我问这个问题最初只是使用DoubleAnimation
,它们是未包含的并且不是Storyboard
的一部分。我已经添加了 Storyboard
,并制作了 Storyboard
和 rectangle 资源,以便可以轻松地重复使用它们。
这是我目前所拥有的:
.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);
}
}
这行得通,但不是我想要的方式。由于 Canvas 是空的,并且所有动画的长度都相同,所以当动画结束时,它将始终是在 Canvas 的第一个子元素上调用的动画。
但是,我想实现随机播放时间的动画,这意味着动画不会总是以相同的顺序开始和结束。不知何故在 SB_Completed 事件中,我想访问它被调用的控件,但我似乎无法找到它的路径。
有没有办法从调用 SB_Completed 事件的 Media.Animation.ClockGroup 到调用动画的控件?
最佳答案
更改将事件处理程序分配给此的行:
SB.Completed += (s,e) => myCanvas.Children.Remove(myRect);
关于c# - 在动画完成时删除 FrameworkElements,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/778795/