Digamos que quiero TextBlock
que sea Width
igual a su contenedor principal Width
(es decir, estirar de lado a lado) o un porcentaje de su contenedor principal Width
, ¿cómo puedo lograr esto XAML
sin especificar valores absolutos?
Quiero hacer esto para que si el contenedor del Contenedor principal se expande más tarde (se ' Width
aumenta), sus' Elementos secundarios también se expandirán automáticamente. (básicamente, como en HTML y CSS)
Respuestas:
La forma de estirarlo al mismo tamaño que el contenedor principal es usar el atributo:
Eso hará que el elemento Textbox se estire horizontalmente y llene todo el espacio primario horizontalmente (en realidad depende del panel principal que esté utilizando, pero debería funcionar en la mayoría de los casos).
Los porcentajes solo se pueden usar con valores de celda de cuadrícula, por lo que otra opción es crear una cuadrícula y colocar su cuadro de texto en una de las celdas con el porcentaje apropiado.
fuente
Puede colocar los cuadros de texto dentro de una cuadrícula para hacer valores porcentuales en las filas o columnas de la cuadrícula y dejar que los cuadros de texto se llenen automáticamente en sus celdas principales (como lo harán de manera predeterminada). Ejemplo:
Esto hará que # 1 2/5 del ancho y # 2 3/5.
fuente
Por lo general, usaría un control de diseño incorporado apropiado para su escenario (por ejemplo, use una cuadrícula como padre si desea escalar en relación con el padre). Si desea hacerlo con un elemento padre arbitrario, puede crear un ValueConverter, pero probablemente no será tan limpio como quisiera. Sin embargo, si lo necesita absolutamente, podría hacer algo como esto:
Que se puede usar así, para obtener un cuadro de texto secundario del 10% del ancho de su lienzo principal:
fuente
CultureInfo.InvariantCulture
a la doble conversión porqueparameter
se considera questring
y en culturas con diferentesdecimal separator
no funcionará como se esperaba.Para cualquiera que reciba un error como: la cadena '2 *' no se puede convertir a Longitud.
fuente
<RowDefinition Height="auto" />
?Se puede usar la implementación de IValueConverter. La clase de convertidor que se hereda de IValueConverter toma algunos parámetros como
value
(porcentaje) yparameter
(ancho del padre) y devuelve el valor de ancho deseado. En el archivo XAML, el ancho del componente se establece con el valor deseado:XAML:
fuente
Sé que no es Xaml, pero hice lo mismo con el evento SizeChanged del cuadro de texto:
El cuadro de texto parece tener un tamaño del 80% de su elemento primario (el margen del lado derecho es del 20%) y se estira cuando es necesario.
fuente
Yo uso dos métodos para el tamaño relativo. Tengo una clase llamada
Relative
con tres propiedades adjuntasTo
,WidthPercent
yHeightPercent
que es útil si quiero que un elemento tenga un tamaño relativo de un elemento en cualquier parte del árbol visual y se sienta menos hacky que el enfoque del convertidor, aunque use lo que funciona para usted, que Estás contento con.El otro enfoque es bastante más astuto. Agregue un lugar
ViewBox
donde desee tamaños relativos dentro, luego dentro de eso, agregue unGrid
ancho de 100. Luego, si agrega unTextBlock
ancho de 10 dentro de eso, obviamente es el 10% de 100.El
ViewBox
escalará elGrid
acuerdo con cualquier espacio que se le ha dado, así que si es la única cosa en la página, a continuación, elGrid
será escalado a cabo ancho completo y eficaz, suTextBlock
se escala al 10% de la página.Si no establece una altura en el,
Grid
entonces se reducirá para ajustarse a su contenido, por lo que todo tendrá un tamaño relativamente. Tendrá que asegurarse de que el contenido no sea demasiado alto, es decir, comience a cambiar la relación de aspecto del espacio dado, de loViewBox
contrario, también comenzará a escalar la altura. Probablemente pueda solucionar esto con unStretch
deUniformToFill
.fuente