C# Animacja + petla

0

Chcę stworzyć program, który za każdym razem, gdy pętla for zrobi nowy cykl, wyświetli moją animację.

for (i = 1; i < 5; i++)
{ 
           MoveBorderHorizontal(i);
}
public void MoveBorderHorizontal(int i)
        {
            int przesuniecie = (i*100) - 100;

            DoubleAnimation da = new DoubleAnimation();
            da.From = przesuniecie;
            da.To = przesuniecie + 100;
            da.Duration = TimeSpan.FromSeconds(1);
            da.AutoReverse = false;
            border1.BeginAnimation(Canvas.LeftProperty, da);
        }

Problem jest, że zanim jedna animacja się skończy, to kolejna już się zaczyna i nie widać, by coś się działo. Widać tylko końcowe położenie. Piszę w WPF, więc jeśli można jakoś pomóc za pomocą XAML to tez proszę o propozycje.

Jak zrobić, by program czekał aż animacja się zakończy?

0

Może w miejscu w którym wstawiłem komentarz:

for (i = 1; i < 5; i++)
{
           MoveBorderHorizontal(i);
/*komentarz*/
}

wstaw coś ala Thread.Sleep(100);

Jeżeli chodzi o animację w WPFie to najlepiej użyć do tego StoryBoard.

W ogóle jak interesujesz się animacją i WPFem to zobacz na narzędzie Expression Blend w którym takie animacje robisz w parę sekund.

Pozdrawiam.

0

Nie wiem czy BLEND ma te możliwości co będą mi potrzebne. Mój program ma za zadanie wizualizować proces sortowania za pomocą kilku algorytmów . Przykładowo ten algorytm który teraz robię - bąbelkowy, przedstawiam za pomocą kart do gry. Zastanawia mnie, czy w Blendzie nie będzie problemu tak dokładnie sterować animacją zwłaszcza, że przy różnych danych wejściowych, wszystko będzie się przemieszczało w innej kolejności i elementy zajmą inne miejsce na końcu.

Thread.sleep nie pomaga. Zatrzymuje całą aplikację, ale nie przynosi oczekiwanego efektu.

0

Kiedys tez potrzebowalem funkcji opozniajacej i znalazlem cos takiego, moze Ci sie przyda:

public static DateTime Delay(int MilliSecondsToPauseFor)
        {
            System.DateTime ThisMoment = System.DateTime.Now;
            System.TimeSpan duration = new System.TimeSpan(0, 0, 0, 0, MilliSecondsToPauseFor);
            System.DateTime AfterWards = ThisMoment.Add(duration);

            while (AfterWards >= ThisMoment)
            {
                System.Windows.Forms.Application.DoEvents();
                ThisMoment = System.DateTime.Now;
            }
            return System.DateTime.Now;
        }
0

litosci, ludzie nie tak robi sie animacje, zedne busy waiting i zadne sleep
generalnie jesli chcesz zwizualizowac dzialanie algorytmu sortowania nie musisz wykowywac animacji w momencie wykonania operacji przez algorytm
zakladam ze chcesz pokazac jak dany algorytm zmienia polozenie elementow w tablicy
ja poszedlbym w takie rozwiazanie:
algorytm robi sobie swoja robote, a eventami informuje o tym jakie elementy w tablicy zmienia
inna klasa lapie eventy i dodaje do listy animacji (fifo), a kolejny element (jakas klasa/kontrolka) gui czyta sobie element z kolejki i wykonuje animacji, tak dlugo az dostanie info ze ma juz skonczyc
dzieki temu algorytm bedzie dzialal sobie we wlasnym tempie, a animacja we wlasnym z odpowiedniami opoznieniami i wodotryskami
poza tym w WPF sa odpowiednie mechanizmy do wykonywania animacji, ty chcesz narysowac liste elmentow, a pozniej przestawiac odpowiednie elementy

1

WPF ma pełne wsparcie dla animowania - w sumie nie ma po co wymyślać koła od nowa.

Polecam np.
http://www.codeproject.com/KB/WPF/WPFAnimation.aspx

Albo poszukać innych na
http://www.google.pl/search?q=WPF+animation&ie=utf-8&oe=utf-8&aq=t&rls=org.mozilla:pl:official&client=firefox-a

1 użytkowników online, w tym zalogowanych: 0, gości: 1