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)
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 –
+1 Dokładnie to, co widziałem; po wywołaniu UpdateLayout(), ActualWidth stał się dostępny. – Sabuncu
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