2008-11-11 7 views
81

Parece que debería ser fácil, pero estoy perplejo. En WPF, me gustaría un TextBox que se extienda al ancho de su matriz, pero solo a un ancho máximo. El problema es que quiero que quede justificado dentro de su padre. Para que se estire, debes usar HorizontalAlignment = "Stretch", pero luego el resultado está centrado. He experimentado con HorizontalContentAlignment, pero parece que no hace nada.HorizontalAlignment = Stretch, MaxWidth, y alineado a la izquierda al mismo tiempo?

¿Cómo hago para que este cuadro de texto azul crezca con el tamaño de la ventana, tenga un ancho máximo de 200 píxeles y quede justificado?

<Page 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
    <StackPanel> 
    <TextBox Background="Azure" Text="Hello" HorizontalAlignment="Stretch" MaxWidth="200" /> 
    </StackPanel> 
</Page> 

¿Cuál es el truco?

+0

favor ver [ "preguntas debe incluir‘etiquetas’en sus títulos?"] (http://meta.stackexchange.com/questions/19190/should- questi ons-include-tags-in-their-titles), donde el consenso es "¡no, no deberían"! * Sí, lo sé ... solo por razones heredadas:) * –

Respuesta

81

Puede establecer HorizontalAlignment como Izquierda, su MaxWidth y luego se unen a la WidthActualWidth del elemento padre:

<Page 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
    <StackPanel Name="Container"> 
    <TextBox Background="Azure" 
    Width="{Binding ElementName=Container,Path=ActualWidth}" 
    Text="Hello" HorizontalAlignment="Left" MaxWidth="200" /> 
    </StackPanel> 
</Page> 
+7

No se vuelve a auto .. Parece que se ajusta al contenido. ¿Me falta algo? – Gishu

+0

Esto parece bloquear mi reproductor Silverlight – resopollution

+2

@Gishu, asegúrate de configurar 'HorizontalAlignment =" Stretch "' en el elemento 'Container'. (p.s., me doy cuenta de que hizo esa pregunta hace más de 6 años). –

41
<Grid> 
    <Grid.ColumnDefinitions> 
     <ColumnDefinition Width="*" MaxWidth="200"/> 
    </Grid.ColumnDefinitions> 

    <TextBox Background="Azure" Text="Hello" /> 
</Grid> 
+0

Creo que debe establecer VerticalAlignment = "Top" para el cuadro de texto ... parece ser estirar por defecto. – Gishu

+1

+1. Bonito y limpio. Cada vez que intento administrar el diseño uniéndolo a cierto ancho real (como en la respuesta aceptada), las cosas se complican. –

+1

Acabo de enterarme de esta pregunta mientras trato de resolver el mismo problema. En mi caso, esta es la mejor respuesta ya que funciona en WinRT. La otra respuesta no es porque no se puede unir en ActualWidth en WinRT. – Slade

8

Ambas respuestas dadas trabajaron para el problema indiqué - Gracias!

En mi aplicación real, sin embargo, estaba tratando de restringir un panel dentro de un ScrollViewer y el método de Kent no se manejaba tan bien por alguna razón que no me molesté en rastrear. Básicamente, los controles podrían expandirse más allá de la configuración de MaxWidth y vencer mi intento.

La técnica de Nir funcionó bien y no tuvo el problema con el ScrollViewer, aunque hay una cosa menor a tener en cuenta. Desea asegurarse de que los márgenes derecho e izquierdo en el TextBox estén configurados en 0 o se interpondrán en el camino. También cambié el enlace para usar ViewportWidth en lugar de ActualWidth para evitar problemas cuando apareció la barra de desplazamiento vertical.

6

Puede utilizar esto para el ancho de su DataTemplate:

Width="{Binding ActualWidth,RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ScrollContentPresenter}}}" 

Asegúrese de que su raíz DataTemplate tiene Margen = "0" (se puede utilizar un poco de panel, como la raíz y establecer el margen de los hijos de que la raíz)

0

me gustaría utilizar SharedGroupSize

<Grid> 
    <Grid.ColumnDefinition> 
     <ColumnDefinition SharedGroupSize="col1"></ColumnDefinition> 
     <ColumnDefinition SharedGroupSize="col2"></ColumnDefinition> 
    </Grid.ColumnDefinition> 
    <TextBox Background="Azure" Text="Hello" Grid.Column="1" MaxWidth="200" /> 
</Grid> 
Cuestiones relacionadas