Entwickler-Ecke

WPF / Silverlight - Silverlight-Animation in C#


SGrabert - Fr 05.10.07 13:49
Titel: Silverlight-Animation in C#
Hallo,

bin komplett neu in Silverlight, hoffe hier im Forum Hilfe zu finden, falls mir jemand noch andere Foren für Silverlight/C#-Fragen nennen kann bin ich dankbar :)

Mein Ziel ist es eine Anwendung mit Silverlightinterface komplett in C# zu schreiben.. möglichst wenig Dinge sollen in die xaml-Dateien.

Nun zur Frage:
Ich habe eine Klasse für ein Partikel erstellt

C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
 public class Particle
     {
        private Point m_Position;  /// Position of particle
        private Point m_Speed;     /// Speed
        private Color m_Color;     /// Color
        private Ellipse m_ellipse; /// Drawing object, the particle itself
        private Canvas m_Parent;

        public SoundParticle(Canvas fParent)
        {
            m_Parent = fParent;
            // create particle
            m_ellipse = new Ellipse();
            // add to Canvas
            m_Parent.Children.Add(m_ellipse);
        }
      }


Nun sollen in einer Schleife oder in einem Timer alle Objekte bewegt werden.
Dafür existiert die Klassen-Funktion Move();
In dieser Funktion wird die Ellipse an die entsprechende Position des Partikels gesetzt.
Mein Frage ist wie ich das am Besten (im Sinne von Silverlight) lösen kann.

System.Threading.Thread habe ich bereits probiert, bekomme jedoch beim Zugriff auf z.B. m_Position eine "Invalid Cross-Thread access"-Violation. Also keine Threads ;)

Es gibt noch "Animation, Storyboard, Timeline, div. Timer", alles ein bisschen viele Möglichkeiten für meinen Geschmack...
Aktueller Versuch (funktioniert nicht)

C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
        MovingParticles = new DoubleAnimation();
            MovingParticles .Duration = new TimeSpan(00011);
            MovingParticles .From = 0;
            MovingParticles .To = 1;
            ParticleStoryboard = new Storyboard();
            ParticleStoryboard .Children.Add(MovingParticles );
            ParticleStoryboard .Completed += Move

Für Hilfe bin ich sehr dankbar :)

Danke im Voraus


Christian S. - Fr 05.10.07 14:14

(1) Wieso willst Du kein XAML machen. Im Allgemeinen ist es viel einfacher, etwas in XAML zu machen als im Code.
(2) Wenn Du eine DoubleAnimation benutzt, brauchst Du weder Timer noch Thread. Die DoubleAnimation macht das alles für Dich.

Der XAML-Code für eine Animation könnte z.B. so aussehen:

XML-Daten
1:
2:
3:
    <Storyboard BeginTime="0" x:Name="triangleAnimationBoard">
      <DoubleAnimation x:Name="triangleAnimation" AutoReverse="True" Duration="00:00:00.5" RepeatBehavior="Forever" Storyboard.TargetName="theTriangle" Storyboard.TargetProperty="(Canvas.Left)"/>
    </Storyboard>


Das animiert dieses kleine Dreieeck "theTriagle" auf dieser Test [http://www.christian-stelzmann.de/temp/silverlight/TestPage.html], wenn man mit der Maus über einen Menüpunkt geht. (Nein, die Seite ist nicht schön oder sinnvoll, war nur zum Testen).

Im Code setze ich dann nur noch die "From"- und "To"-Werte.


SGrabert - Fr 05.10.07 14:27

user profile iconChristian S. hat folgendes geschrieben:
(1) Wieso willst Du kein XAML machen. Im Allgemeinen ist es viel einfacher, etwas in XAML zu machen als im Code.
(2) Wenn Du eine DoubleAnimation benutzt, brauchst Du weder Timer noch Thread. Die DoubleAnimation macht das alles für Dich.

Der XAML-Code für eine Animation könnte z.B. so aussehen:
Im Code setze ich dann nur noch die "From"- und "To"-Werte.


Ja, diese Methode habe ich bereits gefunden und probiert :)
Aber das will ich halt nicht.
Sondern ich will die m_Position-Property der Klasse ändern.
Bzw. sogar eine Funktion der Klasse aufrufen, da ich dort noch einige andere Dinge ablaufen lassen will.
Und das muss für jedes Partikel das während der Laufzeit dynamisch erstellt wird funktionieren..
Könnte man sowas überhaupt in XAML (1.) programmieren?

Btw. das Beispiel ist schick ;)


Christian S. - Fr 05.10.07 14:50

Wenn Du m_Point als BindingProperty machst, solltest Du eigentlich eine PointAnimation in XAML darauf anwenden können. Und im Setter der Property kannst Du dann alles erledigen, was Du noch machen willst ;-)

Am Besten schaust Du mal nach BindingProperty. Falls Du das nicht schon hast, würde ich Dir empfehlen, Dir ein Buch zur WPF besorgen. Die Resourcen im Netz bieten meist nur Lösungen zu speziellen Problemen, erklären aber kaum die Grundkonzepte. Hier [http://www.c-sharp-forum.de/viewtopic.php?p=464303#464303] waren zwei Bücher erwähnt.


SGrabert - Fr 05.10.07 14:56

user profile iconChristian S. hat folgendes geschrieben:
Die Resourcen im Netz bieten meist nur Lösungen zu speziellen Problemen, erklären aber kaum die Grundkonzepte. Hier [http://www.c-sharp-forum.de/viewtopic.php?p=464303#464303] waren zwei Bücher erwähnt.

Ja, das habe ich auch schon gemerkt *seufz*
Das durchlesen und verstehen der ganzen durchaus komplexen Beispiele ist ungleich schwieriger..
Ich schau mal was ich finden kann.
Und danke für die perfekte Antwort :)
Die DoubleAnimation lässt sich im Quellcode erstellen und den Property-Setter kann ich ja wirklich selbst schreiben.

Grüße


SGrabert - Fr 05.10.07 15:03

Ich habe gerade ein perfektes Beispiel mit Code gefunden:
http://www.bubblemark.com/

Unter Silverlight (CLR) findet sich der Quellcode... ein C#-Partikel mit XAML-Template.