Pregunta

He estado enseñando a mí mismo a través de WPF Sells / Griffiths 'Programación de WPF', y he encontrado que es un gran recurso, pero estoy tratando de tomar algunos de los conceptos que me han introducido a una e ir paso más allá, y yo estoy corriendo con un obstáculo conceptual sobre cómo poner las piezas juntas para lograr lo que estoy tratando de hacer.

En este ejercicio, que estoy tratando de crear animaciones autoterminación; FrameworkElements que son creados por los acontecimientos, realizan una animación, y luego se borran a sí mismas. Tengo problemas para encontrar la manera de volver a llamar a la FrameworkElement padres del evento animation.Completed.

Hice esta pregunta originalmente sólo usando DoubleAnimations que eran incontenible y no forma parte de la Storyboard. ya que he añadido el Storyboard, e hizo los recursos Storyboard y rectangulares para que puedan ser reutilizados fácilmente.

Esto es lo que tengo hasta ahora:
.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);
        }
    }

Esto funciona, pero no de la manera que me gustaría. Desde el lienzo está vacía, y todas las animaciones son de la misma longitud, cuando una animación termina, siempre será la que se pidió al primer hijo de la lona.

Sin embargo, me gustaría poner en práctica animaitons que tienen una cantidad aleatoria de tiempo, lo que significa que las animaciones no siempre van a empezar y terminar en el mismo orden. De alguna manera, en el caso SB_Completed, me gustaría tener acceso al control que se está pidiendo a, pero me parece que no puede encontrar el camino a ella todavía.

¿Hay una manera de llegar desde el Media.Animation.ClockGroup que llama al evento SB_Completed al control que la animación está llamado?

¿Fue útil?

Solución

cambiar la línea en la que se asigna el controlador de eventos a lo siguiente:

SB.Completed += (s,e) => myCanvas.Children.Remove(myRect);
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top