2012-03-28 7 views
10

Estaba leyendo sobre este UpdateLayout() method en MSDN.¿Puede darme un ejemplo de cuándo debería usar UIElement.UpdateLayout()?

Dice:

asegura que todos los elementos secundarios visuales de este elemento son adecuadamente actualizado para el diseño.

Pero no entiendo lo que quiere decir diseño no actualizado correctamente.

He estado trabajando con Silverlight/WPF durante más de un año, pero todavía no he usado este método una vez.

Entonces, ¿alguien me puede dar un ejemplo que requiera el uso de este método? Entonces, ¿realmente puedo entender lo que hace y cuándo debería usarlo?

Respuesta

8

Puede que quieras llamarlo si necesitas un control para completar de inmediato su diseño para que pueda hacer algo en función de eso.Por ejemplo, puede llamar al UpdateLayout en un control secundario para obtener un ActualHeight y ActualWidth, si desea hacer otra cosa en función de eso (por ejemplo, colóquelo o dibuje algo con el tamaño correspondiente).

+2

¡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 –

+2

+1 Exactamente lo que estaba viendo; después de llamar a UpdateLayout(), ActualWidth estuvo disponible. – Sabuncu

+0

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

0

Creo que es el más utilizado al construir controles. Por ejemplo: si en el código siente que se agrega un nuevo control o algo particular sucedió, puede llamar a este UpdateLayout() para forzar un nuevo diseño de los controles. En algunos casos, WPF podría considerar que la IU cambia lo suficiente, por lo que llamará a su control UpdateLayout(). Todos cometemos errores ... si encuentra un control que debería "volver a dibujar" o "reorganizar" sus hijos, puede intentar forzarlo a "actualizar" llamando a su "UpdateLayout".

3

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)

+0

hm ... Todavía no entiendo por su ejemplo. Probé tu código y la interfaz de usuario no se actualizará después de llamar a UpdateLayout() antes de Thread.Sleep(), no importa si llamas al método o no. –

+0

@KingChan He actualizado mi respuesta totalmente. Después de mucha investigación, parece que lo que parecía e incluso lo que fuera creía que estaba mal. Este es un método principalmente para actualizar todo el lienzo ... pero casi nunca es necesario. –

+0

thansk para su investigación, por lo que ahora sé que es bastante normal que no necesitemos ese método para arreglar mucho el diseño. Gracias. +1 –

Cuestiones relacionadas