De mi investigación, UpdateLayout
parece ser una manera muy enérgica de actualizar todos los controles en el diseño. Sin embargo, en la mayoría de los casos, el sistema de diseño es lo suficientemente inteligente y lo suficientemente rápido como para actualizarse adecuadamente por sí mismo. Todo lo que he leído me lleva a pensar que esta llamada solo es necesaria si está realizando muchas modificaciones en el diseño (agregando controles y moviéndolos) y necesita que se muestre un escenario de diseño en particular mientras que el resto de la pila de actualización está completado (sin embargo, todavía tengo que ver un buen ejemplo para mostrar esto ... el algoritmo de diseño normal parece ser tan bueno). This MSDN article on layout debería ayudar a aclarar las cosas.
Sin embargo, a partir de lo anterior:
El método UpdateLayout obliga a una actualización de diseño recursivo, y es con frecuencia no es necesario
y this documentation
llamadas frecuentes a InvalidateArrange, o en particular a UpdateLayout, tienen consecuencias significativas en el rendimiento si los números grandes de los elementos existen en la interfaz de usuario. Evite llamar a este método a menos que absolutamente requiera un estado de diseño preciso para las llamadas posteriores a otras API en su código.
En conclusión para responder directamente a su pregunta. Esto se realiza principalmente por sí solo con la lógica de diseño de la interfaz de usuario interna, y es probable que nunca tenga que usarlo. Por lo anterior, me parece que sería bastante obvio cuando necesitas usarlo (y no es para enhebrar tantos, incluso yo mismo había pensado)
¡Oh, guau, como dijiste, realmente funciona! Traté de crear una cuadrícula y un botón dinámicamente. El botón 'ActualHeight/ActualWidth' solo tiene' 0.00' después de que agregué a la Grilla, pero una vez que ejecuto 'UpdateLayout' me da el valor real. Ahora veo lo que puedo usar, ¡gracias! +1 –
+1 Exactamente lo que estaba viendo; después de llamar a UpdateLayout(), ActualWidth estuvo disponible. – Sabuncu
Un escenario más que encontré hoy. En 'OnDropDownOpened' para un combobox personalizado, necesité llamar a' ItemContainerGenerator.ContainerFromItem', pero devolvió null para la primera llamada, y funcionó bien solo en las siguientes llamadas 'OnDropDownOpened'. Tuve que agregar UpdateLayout() antes de llamar a 'ContainerFromItem', y luego comenzó a funcionar también para la primera llamada. Sé que la solución alternativa sería desactivar la virtualización usando 'VirtualizingStackPanel', pero no quería hacerlo por motivos de rendimiento. – JustAMartin