Question

Je me suis enseigné WPF par « Programmation WPF » de Sells / Griffiths, et je l'ai trouvé une grande ressource, mais je suis en train de prendre quelques-uns des concepts qu'ils me ont introduit à aller et plus loin, et je suis en cours d'exécution dans un accroc conceptuel sur la façon de mettre en place les pièces pour accomplir ce que je suis en train de le faire.

Dans cet exercice, je suis en train de créer des animations auto-terminaison; FrameworkElements qui sont créés par les événements, effectuer une animation, puis se supprimer. J'éprouve des difficultés à trouver comment rappeler à la FrameworkElement mère de l'événement animation.Completed.

J'ai posé cette question à l'origine tout en utilisant DoubleAnimations qui étaient et ne fait pas partie non confiné du Storyboard. J'ai depuis ajouté le Storyboard, et a fait les ressources et Storyboard rectangle afin qu'ils puissent être facilement réutilisés.

Voici ce que j'ai jusqu'à présent:
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);
        }
    }

Cela fonctionne, mais pas la façon dont je voudrais lui. Étant donné que la toile est vide, et toutes les animations sont de la même longueur, lorsqu'une animation se termine, il sera toujours celui qui a été appelé le premier enfant de la toile.

Cependant, je voudrais mettre en œuvre animaitons qui prennent une quantité de temps aléatoire, ce qui signifie que les animations ne seront pas toujours commencer et se terminer dans le même ordre. D'une certaine façon dans le cas SB_Completed, je voudrais accéder au contrôle qu'il était appelé, mais je ne peux pas sembler trouver le chemin encore.

Y at-il un moyen d'obtenir de l'Media.Animation.ClockGroup qui appelle l'événement SB_Completed au contrôle que l'animation est appelé?

Était-ce utile?

La solution

changer la ligne où vous attribuez le gestionnaire d'événements à ceci:

SB.Completed += (s,e) => myCanvas.Children.Remove(myRect);
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top