2008-11-11 3 views
81

Кажется, что это должно быть легко, но я в тупике. В WPF я бы хотел, чтобы TextBox растягивался до ширины его родителя, но только до максимальной ширины. Проблема в том, что я хочу, чтобы она оставалась оправданной внутри ее родителя. Чтобы растянуть его, вы должны использовать HorizontalAlignment = «Stretch», но тогда результат центрируется. Я экспериментировал с HorizontalContentAlignment, но он ничего не делает.Горизонтальное выравнивание = выравнивание, максимальная ширина и выравнивание влево одновременно?

Как получить это синее текстовое поле для увеличения с размером окна, иметь максимальную ширину в 200 пикселей и быть оправданным?

<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> 

Какая уловка?

+0

Пожалуйста, смотрите [ "Должны ли вопросы включают„метки“в их названиях?"] (http://meta.stackexchange.com/questions/19190/should- questi ons-include-tags-in-their-titles), где консенсус «нет, они не должны»! * Да, я знаю ... только по причинам, связанным с наследием:) * – 2015-12-30 15:01:31

ответ

81

Вы можете установить HorizontalAlignment налево, установите MaxWidth и затем привязать Width к ActualWidth родительского элемента:

<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> 
41
<Grid> 
    <Grid.ColumnDefinitions> 
     <ColumnDefinition Width="*" MaxWidth="200"/> 
    </Grid.ColumnDefinitions> 

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

Я думаю, вам нужно установить VerticalAlignment = «Top» для текстового поля .. По-видимому, он растягивается по умолчанию. – Gishu 2008-11-11 09:39:19

+1

+1. Хороший и чистый. Каждый раз, когда я пытаюсь управлять макетом, привязывая к некоторой фактической ширине (как в принятом ответе), все становится беспорядочным. – 2014-08-14 05:55:28

8

Оба ответы, даваемые работал на проблемы я заявил - Спасибо!

В моем реальном приложении, хотя я пытался сдержать панель внутри ScrollViewer, и метод Кента не очень хорошо справился с этим по какой-то причине, я почему-то не потрудился отслеживать. По сути, элементы управления могут расширяться за пределы настройки MaxWidth и побеждать мое намерение.

Техника Нира работала хорошо, и у нее не было проблем с ScrollViewer, хотя есть одна второстепенная вещь, которой нужно следить. Вы хотите быть уверены, что поля справа и слева в TextBox установлены в 0 или они будут мешать. Я также изменил привязку, чтобы использовать ViewportWidth вместо ActualWidth, чтобы избежать проблем, когда появилась вертикальная полоса прокрутки.

6

Вы можете использовать это для ширины вашего DataTemplate:

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

Убедитесь, что корень DataTemplate имеет Margin = «0» (вы можете использовать некоторые панели в качестве корня и установить маржу для детей что корень)

0

Я хотел бы использовать 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> 
Смежные вопросы