Autor Beitrag
SGrabert
Hält's aus hier
Beiträge: 4



BeitragVerfasst: Fr 05.10.07 13:49 
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
ausblenden 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)
ausblenden 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.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: 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:
ausblenden 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, 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.

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
SGrabert Threadstarter
Hält's aus hier
Beiträge: 4



BeitragVerfasst: 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.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: 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 waren zwei Bücher erwähnt.

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
SGrabert Threadstarter
Hält's aus hier
Beiträge: 4



BeitragVerfasst: 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 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 Threadstarter
Hält's aus hier
Beiträge: 4



BeitragVerfasst: Fr 05.10.07 15:03 
Ich habe gerade ein perfektes Beispiel mit Code gefunden:
www.bubblemark.com/

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