【问题标题】:Removing FrameworkElements on Animation Completion在动画完成时删除 FrameworkElements
【发布时间】:2010-10-21 04:44:22
【问题描述】:

我一直在通过 Sells/Griffiths 的“Programming WPF”自学 WPF,我发现它是一个很好的资源,但我正在尝试采用他们向我介绍的一些概念并开始学习更进一步,我遇到了关于如何将各个部分组合在一起以完成我想要做的事情的概念障碍。

在本练习中,我尝试创建自终止动画; FrameworkElements 由事件创建,执行动画,然后删除自己。我在弄清楚如何从 animation.Completed 事件中回调父 FrameworkElement 时遇到问题。

我最初只是使用未包含且不属于StoryboardDoubleAnimations 提出这个问题。此后,我添加了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);
        }
    }

这可行,但不是我想要的方式。由于画布是空的,并且所有动画的长度都相同,因此当动画完成时,它将始终是在画布的第一个子节点上调用的动画。

但是,我想实现花费随机时间的动画,这意味着动画不会总是以相同的顺序开始和结束。不知何故,在 SB_Completed 事件中,我想访问它被调用的控件,但我似乎无法找到它的路径。

有没有办法从调用 SB_Completed 事件的 Media.Animation.ClockGroup 到调用动画的控件?

【问题讨论】:

    标签: c# wpf animation storyboard frameworkelement


    【解决方案1】:

    将分配事件处理程序的行更改为:

    SB.Completed += (s,e) => myCanvas.Children.Remove(myRect);
    

    【讨论】:

    • 以前我什至没有想过这个方向。谢谢。效果很好。
    猜你喜欢
    • 2020-05-11
    • 2010-11-28
    • 2013-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多