2012-03-13 11 views
5

Załadowałem formanty użytkownika w określonej siatce w naszej aplikacji i dodałem animacje do ładujących formantów użytkownika w sterowaniu zdarzeń Loaded.Czy jest jakieś zdarzenie po załadowaniu i przed wyświetleniem kontroli użytkownika?

Niektóre elementy sterowania użytkownika są lekkie, a niektóre z nich wymagają dużych obliczeń przed załadowaniem. Problem polega na tym, że gdy dodam animację 1-sekundową do ciężkich kontrolek użytkownika, wyświetlenie kontroli oznacza, że ​​animacja nigdy nie będzie widoczna!

Czy jest jakieś inne wydarzenie, w którym mogę dodać moją animację do kontroli użytkownika, aby ciężkie i jasne były wyświetlane z tą samą animacją?

Potrzebuję zdarzenia tuż przed wyświetleniem kontrolki. OnLoaded nie wydaje się być właściwym miejscem dla mnie, niestety.

Odpowiedz

5

Odpowiedź została dając Storyboard.Begin niższy priorytet.

dowiedziałem się go z tej odpowiedzi: https://stackoverflow.com/a/4708172/970420

więc mamy ten kod rozpoczynający animację:

void BeginStoryboardAction(Storyboard sb) 
    { 
     sb.Begin(); 
    } 

i powinniśmy nazwać w ten sposób:

Dispatcher.BeginInvoke(new Action<Storyboard>(BeginStoryboardAction), DispatcherPriority.ContextIdle, sb); 

sb to instancja Storyboard, która zawiera animacje.

[Edit]: Innym krótsza droga:

Dispatcher.BeginInvoke(new Action<Storyboard>(delegate (Storyboard stb){stb.Begin();}), DispatcherPriority.ContextIdle, sb); 
3

Po otwarciu okna zdarzenia Loaded i ContentRendered są wywoływane tylko po podniesieniu zdarzenia Activated. Mając to na uwadze, okno można skutecznie uznać za otwarte po podniesieniu ContentRendered.

http://msdn.microsoft.com/en-us/library/ms748948.aspx

+2

Dziękuję Aksel za uwagę, ale przetestowałem ContentRendered na okno kontenera i po uruchomieniu zostaje on automatycznie zwolniony i nigdy więcej nie zostanie zwolniony. Jednak dostaję się do rozwiązania :) Rozwiązanie znajduje się tutaj: http://stackoverflow.com/a/4708172/970420 jak Rick powiedział, że powinniśmy zaplanować planszę story tak, aby miał najniższy priorytet. Więc dodałem 'void BeginStoryboardAction() {sb.Begin(); } 'i odroczone wywoływanie go w ten sposób:' Dispatcher.BeginInvoke (nowa akcja (BeginStoryboardAction), DispatcherPriority.ContextIdle); 'działa jak urok nawet dla ciężkich ładowań kontrolek użytkownika :) –

0

Dla tych, którzy szukają sposób ogólny na wykonanie kodu tuż po tworzony składniki, ale zanim zostaną one renderowane zdarzenie LayoutUpdated pomaga. Powinno to działać zarówno w oknach, jak i wewnątrz użytkownika lub niestandardowych kontrolkach.

Powiązane problemy