Frage

Ich habe mich unterrichtet WPF durch Sells / Griffiths' ‚Programming WPF‘, und ich habe es eine große Ressource gefunden, aber ich versuche, einige der Konzepte nehmen sie mir vorgestellt habe und gehen ein Schritt weiter, und ich laufe in eine konzeptuelle snag, wie die Stücke zusammen zu erreichen, was ich versuche zu tun.

In dieser Übung versuche ich selbst beende Animationen zu erstellen; FrameworkElements, die durch Ereignisse erstellt werden, führen Sie eine Animation, und selbst dann löschen. Ich habe Probleme, herauszufinden, wie die Mutter FrameworkElement vom animation.Completed Ereignisse zurückrufen.

, fragte ich diese Frage ursprünglich nur DoubleAnimations verwenden, die nicht enthaltene und nicht Teil der Storyboard waren. Ich habe die Storyboard seit hinzugefügt, und machte die Storyboard und Rechteck-Ressourcen, so dass sie leicht wiederverwendet werden.

Hier ist, was ich bisher:
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);
        }
    }

Dies funktioniert, aber nicht in der Art und Weise würde ich es mag. Da die Leinwand leer ist, und alle Animationen sind gleich lang, wenn eine Animation beendet ist, wird es immer derjenige sein, der auf dem ersten Kind der Leinwand genannt wurde.

Aber ich mag animaitons implementieren, die eine zufällige Menge an Zeit in Anspruch nehmen, so dass Animationen nicht immer starten und in der gleichen Reihenfolge beenden. Irgendwie im SB_Completed Fall, würde Ich mag die Steuerung zuzugreifen, die sie aufgerufen wurde, aber ich kann nicht den Weg dorthin scheint noch zu finden.

Gibt es eine Möglichkeit von dem Media.Animation.ClockGroup zu erhalten, die das SB_Completed Ereignis an die Steuerung fordert, dass die Animation auf genannt wird?

War es hilfreich?

Lösung

ändern Sie die Zeile, wo Sie die Ereignishandler diese zuweisen:

SB.Completed += (s,e) => myCanvas.Children.Remove(myRect);
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top