Autor Beitrag
Früchstückskaffee
Ehemaliges Mitglied
Erhaltene Danke: 2



BeitragVerfasst: Di 01.11.16 19:47 
Hallo Forum,
ich habe eine Funktion in C# gebaut, die Usercontrols bewegt animiert. Nun dauert diese funktion 15 ms. wenn nun der code ausgeführt wird, der darunter steht, ist die animation noch nicht fertig. ich benutze das metroframework. gibt es irgwndwie eine möglichkeit zu warten, bis die animation ausgeführt wurde?


Moderiert von user profile iconChristian S.: Topic aus Basistechnologien verschoben am Do 03.11.2016 um 09:42
Palladin007
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1040
Erhaltene Danke: 123

Windows 10 x64 Home Premium
C# (VS 2015 Enterprise)
BeitragVerfasst: Mi 02.11.16 00:30 
Ich gehe davon aus, dass Du mit WPF arbeitest?
Dann sollte das Thema hier auch im WPF-Forum landen ;)

Eine Timeline hat ein Completed-Event.
Sowohl Storyboard als auch die Animations darin leiten von Timeline ab, sie haben also alle das Completed-Event.
Mit einem EventTrigger kannst Du auch in XAML daran horchen. In der System.Windows.Interactivity.dll gibts auch eine andere mMn. bessere Trigger-Variante, die DLL muss bloß eingebunden werden.
Früchstückskaffee
Ehemaliges Mitglied
Erhaltene Danke: 2



BeitragVerfasst: Mi 02.11.16 08:12 
Uns. Sorry, dass habe ich leider nicht gesagt. Ich arbeite mit Windows forms. Das Problem ist, dass die Buttons in ein und derselben Funktion animiert werden über eine foreach Schleife.
Palladin007
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1040
Erhaltene Danke: 123

Windows 10 x64 Home Premium
C# (VS 2015 Enterprise)
BeitragVerfasst: Mi 02.11.16 12:04 
WinForms hat (soweit ich weiß) kein eigenes Animations-System.
Wenn Du da etwas animierst, dann machst Du das selber und dann liegt es auch in deiner Hand, wie Du damit umgehst.
Oder Du nutzt etwas von diesem Framework, was ich nicht kenne :D

Zitat:
wenn nun der code ausgeführt wird, der darunter steht, ist die animation noch nicht fertig


Das klingt nach asynchroner Programmierung. Nutzt Du Tasks?
Die haben eine Methode namens ContinueWith
Früchstückskaffee
Ehemaliges Mitglied
Erhaltene Danke: 2



BeitragVerfasst: Mi 02.11.16 15:52 
Nein. Mit Tasks mache ich noch nichts. Am besten, ich sende mal einen beispielcode:

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
private void AddFriends(object sender, EventArgs e)
        {
            for(int i = 0; i < 10; i++)
            {
                FreundItem freund = new MS_Network.FreundItem();
                freund.Location = new Point(0, freund.Height);
                AddintionalPadding += freund.Height + 20;
                this.panel2.Controls.Add(freund);

                MetroFramework.Animation.MoveAnimation ann = new MetroFramework.Animation.MoveAnimation();
                ann.Start(freund, new Point(40, AddintionalPadding), MetroFramework.Animation.TransitionType.EaseInCubic, 15);
            }
        }



Aber wenn die Schleife jetzt einmal durchlaufen wurde, muss gewartet werden, bis die eine animations zu ende ist
Palladin007
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1040
Erhaltene Danke: 123

Windows 10 x64 Home Premium
C# (VS 2015 Enterprise)
BeitragVerfasst: Mi 02.11.16 16:56 
Ich kanns nicht austesten, aber ich hab das gefunden:

searchcode.com/file/...ion/AnimationBase.cs

Da gibt's in Zeile 34 ein AnimationCompleted-Event, das klingt nach dem, was Du haben willst.
Früchstückskaffee
Ehemaliges Mitglied
Erhaltene Danke: 2



BeitragVerfasst: Mi 02.11.16 19:07 
Das stimmt. Das AnimationCompleted event. aber irgendwie muss ich das ja mit der funktion verbinden, sprich an.animationcompleted += new eventhandler(dieaktuellefunktion); aber das funktioniert nicht
Palladin007
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1040
Erhaltene Danke: 123

Windows 10 x64 Home Premium
C# (VS 2015 Enterprise)
BeitragVerfasst: Mi 02.11.16 19:09 
"funktioniert nicht" ist keine Fehlermeldung ;)


Zuletzt bearbeitet von Palladin007 am Fr 04.11.16 09:18, insgesamt 1-mal bearbeitet
Früchstückskaffee
Ehemaliges Mitglied
Erhaltene Danke: 2



BeitragVerfasst: Mi 02.11.16 19:19 
Naja das funktioniert schon, aber dann wird die methode immer öfter ausgeführt, als normal. :(
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3941
Erhaltene Danke: 728


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Mi 02.11.16 19:24 
Welche Methode? Was ist für dich normal? Was ist genau anders als normal.

Biete versuche deine Problem so zu schildern das auch jemand der nicht mit dir auf deinem Monitor schaut das verstehen kann.
Du brauchst Hilfe zu irgendeinem Framework das du irgendwo gefunden. Die Wahrscheinlichkeit das das jemand kennt und deshalb deine Fragen mal so eben aus der Lamäng beantworten könnte geht gegen null.
Also musst du das schon genau beschreiben damit wir das mit Allgemeinwissen vielleicht lösen können.
Früchstückskaffee
Ehemaliges Mitglied
Erhaltene Danke: 2



BeitragVerfasst: Mi 02.11.16 19:33 
Sorry, Probleme zu beschreiben ist nicht meine stärke. ich versuche es mal:
es gibt eine methode "addfriends". in dieser werden durch eine schleife usercontrols erzeugt, die animiert werden sollen (durch das metroframework). wenn die animation fertig ist, stellt das framework ein event "animationcompleted" bereit. dieses event wird gefeurt, wenn die animation fertig ist. wenn man in dieser for schleife nun aber immer das completed event mit der aktuellen methode verknüft, quadriert sich die anzahl der methodenaufrufe immer (wegen dem +=). in meinem fall möchte ich aber warten, bis die animation zu ende ist und dann soll die for schleife weiter laufen.
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3941
Erhaltene Danke: 728


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Mi 02.11.16 19:49 
Du willst uns alle sagen das die 10 Animationen die du über die for Schleife startest parallel laufen du willst die aber nacheinander?
Oder willst du das der Code der nach den 10 Animation stattfindet erst stattfindet wenn alle 10 fertig sind die 10 dürfen aber ruhig parallel laufen?

Zeig uns den Code mit dem registrieren des Events. Dieser Pseudocode an.animationcompleted += new eventhandler(dieaktuellefunktion); macht mir Angst.
Frühlingsrolle
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 952
Erhaltene Danke: 126

[Win NT] 5.1 x86 6.1 x64
[Delphi] 7 PE, 2006, 10.1 Starter, Lazarus - [C#] VS Exp 2012 - [Android API 15] VS Com 2015, Eclipse, AIDE
BeitragVerfasst: Do 03.11.16 02:51 
user profile iconFrüchstückskaffee hat folgendes geschrieben:
[...] gibt es irgwndwie eine möglichkeit zu warten, bis die animation ausgeführt wurde?

Ja:

MetroAnimation

Obwohl die Klasse eine überschaubare Anzahl an Methoden aufweist, bist du dennoch nicht selbstständig auf eine Möglichkeit gestossen? :gruebel:

Wenn du die Animationen nacheinander haben möchtest, dann initialisiere die .MoveAnimation() einmal global und rufe nur .Start() in der Schleife auf.

Und für die Anderen: nein, es ist nicht nur für WPF, sondern auch für WinForms gedacht. Und so exotisch ist das "Framework" auch wieder nicht
Einloggen, um Attachments anzusehen!
_________________
„Nicht für das Leben, sondern für die Schule lernen wir.“ „Kürze die lange Rede, damit sie nicht verdächtig wirke!“
(Lucius Annaeus Seneca : 1 - 65 n. Chr)
Früchstückskaffee
Ehemaliges Mitglied
Erhaltene Danke: 2



BeitragVerfasst: Do 03.11.16 14:20 
Also ich habe die .MoveAnimation jetzt über den Konstruktor öffentlich initialisiert:

ausblenden C#-Quelltext
1:
public MetroFramework.Animation.MoveAnimation an2 = new MetroFramework.Animation.MoveAnimation();					


Wenn ich diese Methode nun in der Schleife ausführe, dann werden die Usercontrols zwar hinzugefügt, aber anscheinend wird die Animationsmethode nicht ausgeführt:

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
foreach (string s in S)
                    {
                        FreundItem freund = new FreundItem();
                        freund.Location = new Point(0, AddintionalPadding);
                        freund.label1.Text = "uhuh";
                        freund.label2.Text ="ijojoij";
                        freund.label3.Text = "uiihuihui";
                        freund.label4.Text = "oiiohjojoijoij";
                        this.panel2.Controls.Add(freund);

                        an2.Start(freund, new Point(40, AddintionalPadding), MetroFramework.Animation.TransitionType.EaseInCubic, 15);
                        AddintionalPadding += freund.Height + 20;
                }
Frühlingsrolle
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 952
Erhaltene Danke: 126

[Win NT] 5.1 x86 6.1 x64
[Delphi] 7 PE, 2006, 10.1 Starter, Lazarus - [C#] VS Exp 2012 - [Android API 15] VS Com 2015, Eclipse, AIDE
BeitragVerfasst: Do 03.11.16 15:32 
Ist S zu dem Zeitpunkt möglicherweise leer? Bitte gewöhn' dir bessere Namensgebungen an.

_________________
„Nicht für das Leben, sondern für die Schule lernen wir.“ „Kürze die lange Rede, damit sie nicht verdächtig wirke!“
(Lucius Annaeus Seneca : 1 - 65 n. Chr)
Früchstückskaffee
Ehemaliges Mitglied
Erhaltene Danke: 2



BeitragVerfasst: Do 03.11.16 15:43 
Nein. Die UserControls werden ja dem Panel hinzugefügt, aber die werden an der Location 0x geadded. Danach müsste ja eigentlich die Animation angreifen und diese verschieben :(
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 3321
Erhaltene Danke: 610

Win7
C++, C# (VS 2010/12/13/15)
BeitragVerfasst: Do 03.11.16 16:01 
In welcher Methode bzw. Ereignis wird denn die Animation ausgeführt? Die Form muß dabei wenigstens das Shown-Ereignis durchlaufen haben...
Frühlingsrolle
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 952
Erhaltene Danke: 126

[Win NT] 5.1 x86 6.1 x64
[Delphi] 7 PE, 2006, 10.1 Starter, Lazarus - [C#] VS Exp 2012 - [Android API 15] VS Com 2015, Eclipse, AIDE
BeitragVerfasst: Do 03.11.16 16:04 
user profile iconFrüchstückskaffee hat folgendes geschrieben:
Die UserControls werden ja dem Panel hinzugefügt, aber die werden an der Location 0x geadded

Also werden die Controls garnicht erzeugt? Dann schlägt die Schleife fehl. Was genau ist nun S?

_________________
„Nicht für das Leben, sondern für die Schule lernen wir.“ „Kürze die lange Rede, damit sie nicht verdächtig wirke!“
(Lucius Annaeus Seneca : 1 - 65 n. Chr)
Früchstückskaffee
Ehemaliges Mitglied
Erhaltene Danke: 2



BeitragVerfasst: Do 03.11.16 16:15 
Doch doch, die Controls werden erzeigt. Sie werden auch dem Panel hinzugefügt. Für die Animation setzt ich die Location erst auf 0x, damit sie auf 40x animiert wird.
Ich habe zum Test in der foreach Schleife die Methode .MoveAnimation neu instanziert. Jetzt funktioniert es, aber alle UserControls werden gleichzeitig verschoben. Ich möchte aber, dass sie nacheinander verschoben werden
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 3321
Erhaltene Danke: 610

Win7
C++, C# (VS 2010/12/13/15)
BeitragVerfasst: Do 03.11.16 16:21 
Dann beschreibe mal genau was du haben möchtest.
So etwa:
- zuerst alle UserControls auf dem Panel an Position 0 erzeugen
- dann der Reihe nach die UserControls bewegen
???

Für so ein Szenario würde ich jeweils im AnimationCompleted die nächste Animation starten (solange es welche gibt) - und die erste dann direkt nach der UserControl-Erzeugungsschleife. Speichere dir dazu am besten die Animationen in einer Liste.