Удаление элементов FrameworkElements по завершении анимации

StackOverflow https://stackoverflow.com/questions/778795

Вопрос

Я сам обучался WPF с помощью книги Sells / Griffiths "Programming WPF", и я нашел ее отличным ресурсом, но я пытаюсь взять некоторые концепции, с которыми они меня познакомили, и сделать еще один шаг вперед, и я сталкиваюсь с концептуальной проблемой в том, как собрать части вместе, чтобы выполнить то, что я пытаюсь сделать.

В этом упражнении я пытаюсь создать завершающиеся анимации; FrameworkElementфайлы, созданные событиями, выполняют анимацию, а затем удаляют сами себя.У меня возникли проблемы с выяснением, как перезвонить родительскому FrameworkElement из анимации.Завершенное событие.

Изначально я задал этот вопрос, просто используя DoubleAnimationкоторые не были ограничены и не были частью Storyboard.С тех пор я добавил 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);
        }
    }

Это работает, но не так, как мне бы хотелось.Поскольку холст пуст, а все анимации имеют одинаковую длину, когда анимация завершается, она всегда будет той, которая была вызвана для первого дочернего элемента canvas.

Однако я бы хотел реализовать аниматоры, которые занимают случайное количество времени, что означает, что анимации не всегда будут начинаться и заканчиваться в одном и том же порядке.Каким-то образом в событии SB_Completed я хотел бы получить доступ к элементу управления, к которому он был вызван, но, похоже, я пока не могу найти путь к нему.

Есть ли способ получить информацию от средств массовой информации?Анимация.ClockGroup, которая вызывает событие SB_Completed для элемента управления, на котором вызывается анимация?

Это было полезно?

Решение

измените строку, в которой вы назначаете обработчик события этому:

SB.Completed += (s,e) => myCanvas.Children.Remove(myRect);
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top