我一直在WPF自学通过卖出/格里菲思‘WPF编程’,我发现它一个很好的资源,但我试图采取一些他们已经给我介绍的概念和走进一步加强,我快到了如何把拼凑的概念障碍来完成我想要做的。

在本练习中,我试图创建自行终止的动画;由活动产生FrameworkElements,执行动画,然后删除自己。我在搞清楚如何回调用从animation.Completed事件父FrameworkElement问题。

我问这个问题原本只是使用了非包容性,而不是DoubleAnimation的一部分Storyboards。因为我已经添加了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);
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top