2012-03-28 14 views
10

Czytałem o tym UpdateLayout() method w witrynie MSDN.Czy mogę podać przykład, kiedy należy użyć UIElement.UpdateLayout()?

Mówi:

zapewnia, że ​​wszystkie wizualne elementy podrzędne tego elementu są poprawnie zaktualizowane do układu.

Ale nie rozumiem, co rozumie się pod pojęciem Układ nie jest poprawnie aktualizowany.

Pracuję z Silverlight/WPF przez ponad rok, ale nadal nie użyłem tej metody tylko raz.

Czy ktoś może podać przykład, który będzie wymagał zastosowania tej metody? Czy mogę naprawdę zrozumieć, co robi i kiedy powinienem go użyć?

Odpowiedz

8

Możesz chcieć zadzwonić, jeśli potrzebujesz kontrolować, aby natychmiast zakończyć układ, aby można było na nim coś zrobić.Na przykład możesz wywołać UpdateLayout na formancie podrzędnym, aby uzyskać wartości ActualHeight i ActualWidth, jeśli chcesz na tej podstawie zrobić coś innego (np. Ustawić lub narysować coś o odpowiednim rozmiarze).

+2

Och, wow, jak powiedziałeś, że to działa! Próbowałem dynamicznie tworzyć siatkę i przycisk. Przycisk 'ActualHeight/ActualWidth' ma tylko' 0.00' po dodaniu do siatki, ale po uruchomieniu 'UpdateLayout' daje mi aktualną wartość! Teraz widzę, czego mogę użyć, dzięki! +1 –

+2

+1 Dokładnie to, co widziałem; po wywołaniu UpdateLayout(), ActualWidth stał się dostępny. – Sabuncu

+0

Jeszcze jeden scenariusz, który spotkałem dzisiaj. W 'OnDropDownOpened' dla niestandardowego combobox musiałem wywołać' ItemContainerGenerator.ContainerFromItem', ale zwrócono wartość zerową dla pierwszego wywołania i działało dobrze tylko w kolejnych wywołaniach 'OnDropDownOpened'. Musiałem dodać UpdateLayout() przed wywołaniem 'ContainerFromItem', a następnie zaczęło działać również dla pierwszego połączenia. Wiem, że alternatywnym rozwiązaniem byłoby wyłączenie wirtualizacji za pomocą 'VirtualizingStackPanel', ale nie chciałem tego robić ze względu na wydajność. – JustAMartin

0

Myślę, że jest najczęściej używany podczas budowania kontroli. Na przykład: jeśli w kodzie czujesz, że nowa kontrolka została dodana lub coś szczególnego się stało, możesz nazwać to UpdateLayout(), aby wymusić zmianę układu kontrolek. W niektórych przypadkach WPF może uznać, że interfejs użytkownika zmienia się na tyle, że sam wywołuje funkcję UpdateLayout kontrolki(). Wszyscy popełniamy błędy ... jeśli znalazłeś kontrolę, która powinna "odświeżyć" lub "zmienić" swoje dzieci, możesz spróbować zmusić ją do "odświeżenia", wywołując jej "UpdateLayout".

3

Z moich badań, UpdateLayout wydaje się być bardzo skuteczny sposób, aby uzyskać wszystkie elementy sterujące układu do aktualizacji. Jednak w większości przypadków układ jest wystarczająco inteligentny i wystarczająco szybki, aby odpowiednio zaktualizować system. Wszystko, co przeczytałem, prowadzi mnie do przekonania, że ​​to wezwanie jest potrzebne tylko wtedy, gdy wykonujesz wiele modyfikacji layoutu (dodając elementy sterujące i przesuwając je) i potrzebujesz jednego konkretnego scenariusza układu, który będzie wyświetlany, podczas gdy reszta stosu aktualizacji jest ukończone (jednak nadal nie widziałem dobrego przykładu, aby to wyświetlić ... normalny algorytm układu wydaje się być tak dobry). This MSDN article on layout powinien pomóc wyjaśnić pewne rzeczy.

jednak od powyższego:

Sposób UpdateLayout zmusza rekurencyjną aktualizacji układu, i jest często nie jest konieczne

i this documentation

Częste rozmowy do InvalidateArrange, lub w szczególności UpdateLayout, mają znaczące konsekwencje dla wydajności, jeśli duże liczby elementów istnieje w interfejsie użytkownika. Unikaj wywoływania tej metody, chyba że absolutnie wymaga dokładnego stanu układu dla kolejnych wywołań do innych interfejsów API w kodzie .

Podsumowując, aby bezpośrednio odpowiedzieć na pytanie. Zwykle odbywa się to samodzielnie z wewnętrzną logiką układu UI i najprawdopodobniej nigdy nie będziesz jej potrzebować. Z powyższego, wydaje mi się, że byłoby to dość oczywiste, gdy trzeba go użyć (i nie jest to do gwintowania tak wielu, w tym myślałem)

+0

hm ... Nadal nie rozumiem z twojego przykładu. Próbowałem Twojego kodu, a interfejs użytkownika nie zaktualizuje się po wywołaniu funkcji UpdateLayout() przed Thread.Sleep(), nie ma znaczenia, czy wywołać metodę, czy nie. –

+0

@KingChan Całkowicie zaktualizowałem swoją odpowiedź. Po wielu badaniach wydaje się, że to, co się wydawało, a nawet to, co tam jest, jest błędne. Jest to metoda głównie do aktualizacji całego płótna ... ale prawie nigdy nie jest potrzebna. –

+0

thansk dla twoich badań, więc teraz wiem, że to całkiem normalne, że nie potrzebujemy tej metody, aby naprawić układ. Dzięki. +1 –

Powiązane problemy