2010-04-06 8 views
5

Estoy intentando construir un panel simple que contenga un elemento secundario y lo ajustará a los tamaños de cuadrícula más cercanos. Me está costando averiguar cómo hacerlo anulando MeasureOverride y ArrangeOverride.Necesito ayuda para comprender WPF MeasureOverride y ArrangeOverride infinito y 0 tamaños

Esto es lo que estoy buscando: Quiero que mi panel le diga a su propietario que (a) quiere ser lo más grande posible, luego (b) cuando descubra cuál es ese tamaño, se dimensionará y su UIE hijo según el punto de snap más pequeño más cercano. Entonces, si estamos ajustando a 10, y puedo estar en una región no mayor a 192x184, el panel le dirá a su contenedor padre "mi tamaño real será de 190x180". De esta forma, cualquier cosa que limite con mi control podrá alinearse con sus bordes, a diferencia del espacio potencial.

Cuando coloco mi panel dentro de una rejilla, recibo 0 o PositiveInfinity (lo olvido) para el tamaño entrante en las anulaciones, pero lo que necesito saber es "¿qué tan grande puede llegar a mi espacio?" no infinitos ..

Parte del problema, creo que es lo que WPF considera los valores mágicos de PositiveInfinity y 0 para el tamaño. Necesito una forma de decir, a través de MeasureOverride "Puedo ser tan grande como me lo permita" y en ArrangeOverride para ajustar el tamaño al tamaño ajustado.

¿O estoy yendo sobre esto de una manera completamente incorrecta? Medir y organizar se ve muy complicado, solo por deambular un poco en el código de los paneles estándar en Reflector.

Respuesta

5

En el paso de medida, si WPF le envía infinito, se supone que debe decirle qué tan grande quiere ser. Si envía 0, entonces literalmente no hay espacio para su diseño. En el paso Organizar, se le indicará cuánto espacio hay disponible para el diseño, que es muy probable que sea diferente del tamaño que se le dio en el paso de medida. No puedes devolver el infinito en ningún paso. El siguiente código debe lograr lo que busca (tenga en cuenta que estoy asumiendo una propiedad UIElement Child):

protected overrride Size MeasureOverride(Size availableSize) 
{ 
    Child.Measure(availableSize); 
    return Child.DesiredSize; 
} 

protected override Size ArrangeOverride(Size finalSize) 
{ 
    int w = (((int)finalSize.Width)/SnapPrecision) * SnapPrecision; 
    int h = (((int)finalSize.Height)/SnapPrecision) * SnapPrecision; 

    Child.Arrange(new Rect(0, 0, w, h)); 
    return new Size(w, h); 
} 
Cuestiones relacionadas