2010-09-07 7 views
10

Me he dado cuenta de que Android, WPF y Silverlight siguen un patrón de diseño de dos pasos. Hay un método recursivo de Measure() que se llama para dimensionar el elemento, posiblemente varias veces. Luego se llama a un método Recursive Layout/Arrange() que establece las posiciones exactas de los niños en su control principal, y también establecerá el tamaño final del control.Diseño de IU de dos pasadas: ¿Por qué?

Mi pregunta: ¿por qué esto se divide en dos pasadas, especialmente cuando, para algunos tipos de controles, Measure() no puede calcular el tamaño real de un control sin establecer realmente las posiciones de los niños? ¿Hay algún tipo de caso minoritario de diseño que sea posible gracias a esto?

Estoy tratando de crear mi propio conjunto de herramientas de interfaz de usuario, y actualmente me estoy inclinando por un diseño de diseño de una sola pasada(), pero me gustaría estar convencido de si esto es acertado o no.

Gracias por leer esto :)

Sean

Respuesta

12

La razón de las dos pasadas es que cualquier elemento de la estructura puede influir en el espacio disponible restante de los otros.

Algunos elementos desean tomar el mayor espacio posible, mientras que otros tienen dimensiones fijas. También puede tener elementos con solo un ancho máximo establecido. Crea una ecuación que no se puede resolver en una sola pasada.

Los diferentes paneles en la jerarquía preguntan a los elementos qué tamaño necesitan en la primera pasada, luego distribuyen el espacio entre ellos de acuerdo con la naturaleza de cada panel, y finalmente informa a cada elemento de su espacio asignado.

EDIT: Algunas explicaciones más

El principal inconveniente de un diseño único pase es que usted está manejando cada elemento de forma secuencial. Un primer elemento toma una cierta cantidad de espacio y los otros toman el resto. ¿Por qué este elemento es el primero? Pruebe su algoritmo con un orden de elementos diferente, y tendrá diferentes diseños resultantes.

Un diseño de dos pasos simula un comportamiento paralelo donde cada elemento influye en el diseño completo.

+0

Es el último bit, "finalmente informa a cada elemento de su espacio asignado", esa es la parte importante. El administrador de widgets no permite que los controles se dimensionen solo, solo les permite dar pistas. – moswald

+0

Hmm. Entiendo cómo los niños pueden ser codiciosos sobre el tamaño que se les asigna, y luego le corresponde a los padres repartir la cantidad correcta de espacio. Pero, puede lograr esto en un algoritmo de paso único haciendo una medida() de cada elemento secundario, y luego un diseño final() para cada elemento secundario, todo bajo la llamada de diseño() del elemento principal. Esto seguiría siendo una única recursión del árbol, pero con dos pases para cada grupo de niños. ¿Estoy en lo cierto al pensar que esto logra el mismo fin que el enfoque de dos pasos, pero es menos eficiente? – Sean

+0

Desde la perspectiva de los abuelos, el padre es solo otro hijo al que quiere medir() y el diseño(). ;) – Bubblewrap

Cuestiones relacionadas