2012-01-04 18 views
6

Quiero que el tamaño de fuente de mis etiquetas y cuadros de texto en mi formulario LOB crezca y se reduzca con el cambio de tamaño o resolución de la ventana. Para lograr esto, coloqué mis etiquetas y cuadros de texto dentro de las cajas de vista.El cuadro de texto no se ampliará para llenar viewbox

Las etiquetas y los botones de radio personalizados se comportan como esperaba, pero los cuadros de texto no se estirarán horizontalmente para llenar la ventana de vista (no se puede publicar la imagen debido a la repetición). Los cuadros de texto llenarán horizontalmente el cuadro de vista si escribe en ellos.

Aquí se muestra un ejemplo del código que estoy trabajando con:

<Grid> 
     <Grid.ColumnDefinitions> 
      <ColumnDefinition Width="0.186*"/> 
      <ColumnDefinition Width="0.814*"/> 
     </Grid.ColumnDefinitions> 
     <Grid.RowDefinitions> 
      <RowDefinition Height="0.127*"/> 
      <RowDefinition Height="0.873*"/> 
     </Grid.RowDefinitions> 
     <Viewbox Margin="0,0,0.917,0"> 
      <Label Content="First name:"/> 
     </Viewbox> 
     <Viewbox Grid.Column="1"> 
      <TextBox TextWrapping="Wrap"/> 
     </Viewbox> 
    </Grid> 

He intentado colocar la rejilla, StackPanel y DockPanel (con LastChildFill = "true") dentro del negatoscopio y luego colocar los cuadros de texto dentro de estos controles de diseño, pero tampoco funcionó. ¿Hay alguna forma de que los cuadros de texto llenen horizontalmente la vista padre?

Este problema es similar a esto: WPF TextBox won't fill in StackPanel pero este problema es con paneles de distribución, no viewboxes.

+0

Lo primero es hacer que su xaml sea correcto: no especifica Columna/fila para cada elemento de su grilla. – GameAlchemist

+1

@VincentPiel Eso en realidad no importa. Columna y fila predeterminadas a 0. – mydogisbox

Respuesta

10

Creo que lo que quiere no es posible. ViewBox les dice a sus hijos que tienen espacio in-itito, en el paso de medida del diseño. Después de eso, la pantalla se ajusta a la vista. Ahora un cuadro de texto, que se dice que tiene espacio infinito, obviamente no se puede estirar. Tengo 2 soluciones, que creo que no son lo que quieres, pero podrían ser útiles de todos modos.

La primera:

<Viewbox Grid.Column="1" Grid.Row="0" Stretch="Uniform" > 
    <Grid Width="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Viewbox}}, Path=ActualWidth}"> 
     <TextBox TextWrapping="Wrap" HorizontalAlignment="Stretch" VerticalAlignment="Stretch"/> 
    </Grid> 
</Viewbox> 

Esto estirará que TEXTBOX de hecho, pero desactivar el comportamiento esperado del negatoscopio. ¿Por qué? Le dijimos a ViewBox que mantuviera la relación de aspecto y configuramos el cuadro de texto para que ocupe todo el ancho de la vista, lo que mantiene el tamaño del cuadro de texto.

El segundo:

sería añadir una altura a la red, tomada desde la etiqueta, modificado con el ScaleTransform de su negatoscopio.

Éste no lo he intentado, pero implicaría un convertidor de valor.

En conclusión: no hay una manera fácil de lograr lo que desea, debido a la forma en que viewbox presenta sus hijos. Si solo quieres estirar horizontalmente, mi primera solución funciona bien, si quieres escalar. Supongo que tienes que hacerlo tú mismo.

+1

Una advertencia sobre el enlace al AcutalWidth o la Altura real: "Debido a que ActualHeight es un valor calculado, debe tener en cuenta que podría haber múltiples o incrementales cambios informados en él como resultado de varias operaciones por parte del sistema de disposición.El sistema de diseño puede estar calculando el espacio de medida requerido para los elementos secundarios, las restricciones del elemento principal, etc. "Esto puede hacer que cualquier vinculación con ActualHeight o ActualWidth se active varias veces por cada cambio de tamaño. Esto tendrá un impacto en el rendimiento si también hay muchos de estos bindigs. – mydogisbox

+0

+1 Por supuesto que tienes razón y vale la pena señalarlo, pero en este caso no conozco una solución mejor. – dowhilefor

+0

¡Ja, ja! Lo hice sin el ancho real! – mydogisbox

1

Si lo que quiere no funciona/no es fácil, entonces es falso:

<TextBox GotFocus="TextBox_GotFocus" HorizontalAlignment="Stretch" BorderThickness="0" Grid.Column="1"/> 
    <Viewbox HorizontalAlignment="Left" Stretch="Uniform" Grid.Column="1"> 
     <TextBox x:Name="NameTextBox" Width="50" TextWrapping="Wrap" Text="Text" BorderThickness="0"/> 
    </Viewbox> 

    private void TextBox_GotFocus(object sender, RoutedEventArgs e) 
    { 
     NameTextBox.Focus(); 
     NameTextBox.SelectionStart = NameTextBox.Text.Length; 
    } 

Básicamente lo que ocurre es otra TextBox está detrás del Viewbox y cuando el detrás TextBox obtiene foco, la aplicación cambiará enfoque a Viewbox 's TextBox. Esto producirá un cambio de tamaño extraño ya que tiene la configuración de su cuadrícula con tamaños relativos. Tendrá que jugar con los tamaños de columna/ancho de la grilla hasta que obtenga el efecto que desea.

Cuestiones relacionadas