Animacja c#

Wyobraźmy sobie taką sytuacje, że mamy jakąś animację w Silverlight –cie, która zachodzi dla przycisku A.

Teraz chcemy jednak by dla przycisku B wykonała się ta sama animacja tylko w drugą stronę od końca.

Niby jest to prosta i oczywista rzecz jednak rozśmieszyły mnie odpowiedzi na forum Silverlight . Do rozwiązania tego problemu trzeba stworzyć dokładnie taką samą animację (storyboard), która wykonuje się od tyłu. Wygląda mi to trochę na marnotrawstwo czasu i energii.

Dla krótkiej animacji najlepszym rozwiązaniem jest Visual State Menager. Tworzymy stan A i B . Powiedzmy, że dla stanu “A” kontrolka jest biała, a dla stanu “B” jest czarna. Gdy dana kontrolka przechodzi ze stanu A do stanu B zachodzi animacja przejścia z białego na czarny, a gdy przechodzi z B do A zachodzi animacja przejścia z czarnego na biały. Brzmi ciekawie nieprawdaż, zwłaszcza, że możemy mieć więc stanów niż tylko 2.

Jednak w tym poście opiszę jak cofnąć animacje za pomocą C# . Ta metoda ma sens gdy mamy długą animację i chcemy ją po prostu obejrzeć cofniętą.

Na początek rzućcie okiem na aplikację Silverlight.

Aplikacja jest prosta. Pierwsze naciśnięcie przycisku powoduje obrócenie, a ponowne naciśniecie spowoduje zajście te samej animacji tylko w odwrotną stronę. A tak wygląda kod.

bool ready = false;

       private void button1_Click(object sender, RoutedEventArgs e)
       {
           if (ready)
           {
               ready = false;
               Storyboard.AutoReverse = true;
               Storyboard.Seek(TimeSpan.FromSeconds(0.99));
           }
           else {
               Storyboard.Stop();
               Storyboard.AutoReverse = false;
               Storyboard.Begin();
               ready = true;
           }

Przy pierwszej animacji zachodzi “else” . Zatrzymuję animację potem wyłączam dla niej automatyczne cofanie. Uruchamiam ją a potem zmieniam wartość “ready” na prawdziwą.

Teraz dla drugiego kliknięcia zmieniam wartość “ready” na nieprawdziwą. Włączam możliwość cofania i za pomocą metody “Seek” przesuwam animację o jedną mili sekundę przed jej zakończeniem.

W zasadzie mogłem zastosować toggleButton, który ma swój stany zależny od tego czy został już zaznaczony, czy też nie.

Dla większych bajerów warto pamiętać, że klasa StoryBoard posiada pole “FillBehavior”, które decyduje o tym, czy po skończeniu animacja ma się zatrzymać. Zastosowałem to w jednej aplikacji na konferencję ITAD w Białej Podlaskiej.