2011-04-18 8 views
5

me pregunto si hay una manera fácil de obtener el ancho de un control en WPF en tiempo de ejecución mientras el control está colapsado.¿Cómo obtener el ancho/alto de un control colapsado en WPF?

cuando uso el control. Ancho obtendría el siguiente resultado: -1. # IND y control.actualWidth devolverá 0.0 porque se colapsó.

quiero cambiar el tamaño de mi ventana y luego mostrar el control contraído.

gracias

Editar:
Algunos detalles

tengo una rejilla con 2 columnas en mi ventana, la primera columna contiene un control de ficha, la segunda columna contiene un control de expansión. Quiero ampliar el ancho de mi ventana al expandir el control de expansión, por lo que el contenido en la primera columna seguirá siendo de su tamaño.

+0

¿Por qué tiene que ser hecho de esta manera? ¿No puedes simplemente mostrar el control y luego cambiar su tamaño? –

+0

Realmente no conozco WPF pero ¿puede establecer la visibilidad en falso y luego expandirla y tomar el ancho/alto? –

+0

@SimonBesner pensé en hacerlo de esta manera, pero para mí es más una solución y no la manera "correcta";) y este enfoque tiene una desventaja: digamos que tengo un control de expansión y en el evento expandido mostraré mal cuadrícula y cambiar el tamaño de la ventana directamente después de eso. el Windowsize no cambiará la primera vez que hago esto. No sé por qué es así, pero lo probé. – r1cki

Respuesta

0

¿Qué tamaño espera obtener?

El tamaño no depende solo del control sino también de su contenedor. Por lo tanto, el tamaño real no se puede determinar a menos que el control se represente realmente.

En lugar de usar Colapsar, podría hacerlo invisible de esa manera, se dimensionará según su propia lógica y la lógica del contenedor.

EDITAR

En los comentarios se hizo evidente que cuál era la razón por la que necesita el tamaño del control:

tengo una cuadrícula con 2 columnas en la ventana de mi , la primera la columna tiene un control de tabulación , la segunda columna a tiene un control de expansor . Quiero extender el ancho de mi ventana al expandir el control del expansor , por lo que el contenido en la primera columna permanecerá en su tamaño.

Mi respuesta:

Establecer la SizeToContent de la ventana para WidthAndHeight y definir el ancho de las dos columnas de la cuadrícula en Auto. Eso debería cuidar de él.

+0

al ocultar el control, reservará su espacio en el diseño. por eso estoy colapsando. – r1cki

+0

Entonces, ¿cómo espera que el control le diga su tamaño, entonces? Está colapsado ... –

+0

no lo sé :(pensé que podría haber una forma de obtener el tamaño estimado, así que supongo que solo puedo usar soluciones como mostrar el control una vez y guardar el tamaño en una variable o expandir el control/visible de forma predeterminada. – r1cki

1

Coloque el control en cuestión dentro de un contenedor (como un ContentControl) y contraiga el contenedor en lugar del control en sí. Luego, debería poder simplemente llamar al Measure (o usar la propiedad DesiredSize) en el control para determinar cuánto espacio desea.

+0

Supongo que sería otra solución – r1cki

0

Creo que estás haciendo esto de la manera incorrecta. Puede configurar el ancho y la altura de la ventana en "Auto" y luego se encargará de todos los cambios de tamaño.

El problema surge cada vez que configura directamente la propiedad Ancho de cualquier control (créanme que lo he hecho). Una vez que hagas eso, le has dicho a WPF que no tengas que cambiar el tamaño de la lógica, sé lo que estoy haciendo.

Si considera que no es cambio de tamaño en el momento adecuado puede agregar un controlador a algún evento y luego llamar control.InvalidateVisual() o control.InvalidateMeasurement() que hará pasar por un pase de nuevo diseño.

+1

Para establecer el alto y el ancho de una ventana en automático: establezca SizeToContent de la ventana en True –

+0

@Erno buen punto, no solo tiene que configurar Ancho y Altura a '" Auto "' sino también 'SizeToContent =" WidthAndHeight "' – Jose

0

Tiene que llamar al método UpdateLayout en el control o control de control. Después de eso, las cosas pueden funcionar correctamente.

0

En UWP se puede determinar el tamaño del control colapsado por lo que es visible por un segundo y luego ocultarlo de nuevo, el cambio no es perceptible:

var oldVisibility = myBorder.Visibility; 
myBorder.Visibility = Visibility.Visible; 
myBorder.UpdateLayout(); 
var height = myBorder.RenderSize.Height; 
myBorder.Visibility = oldVisibility; 
Cuestiones relacionadas