Как изменить размер текстового поля при изменении размера окна - PullRequest
13 голосов
/ 21 декабря 2010

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

Ответы [ 4 ]

21 голосов
/ 21 декабря 2010

Макет в WPF сильно зависит от родительского контейнера. Например, если вы создаете форму с метками и полями ввода, рассмотрите возможность использования панели «Сетка». Размер элементов управления в WPF по умолчанию изменяется в зависимости от поведения макета их родителя. Вот пример окна с двумя помеченными текстовыми полями и двумя кнопками, которые изменяют размер вместе с окном.

<Window>
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="Auto" />
            <ColumnDefinition Width="*" />
        </Grid.ColumnDefinitions>
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto" />
            <RowDefinition Height="Auto" />
            <RowDefinition Height="*" />
        </Grid.RowDefinitions>

        <Label Content="Contact Name" Grid.Row="0" Grid.Column="0" />
        <TextBox Grid.Row="0" Grid.Column="1" />

        <Label Content="Contact Location" Grid.Row="1" Grid.Column="0" />
        <TextBox Grid.Row="1" Grid.Column="1" />

        <StackPanel Orientation="Horizontal" HorizontalAlignment="Right"
                    VerticalAlignment="Bottom" Grid.Row="2" Grid.Column="1">
            <Button Content="OK" Width="75" Height="24" Margin="3" />
            <Button Content="Cancel" Width="75" Height="24" Margin="3" />
        </StackPanel>

    </Grid>
</Window>

Или, если вы хотите что-то похожее на адресную строку браузера, вы можете сделать что-то вроде:

<Window>
    <DockPanel>
        <DockPanel DockPanel.Dock="Top">
            <Button Content="Back" DockPanel.Dock="Left" />
            <Button Content="Forward" DockPanel.Dock="Left" />
            <Button Content="Refresh" DockPanel.Dock="Right" />
            <TextBox /> <!-- fill is assumed for last child -->
        <DockPanel>
        <StatusBar DockPanel.Dock="Bottom" />
        <WebBrowser /> <!-- fill is assumed for last child -->
    </DockPanel>
</Window>

Обратите внимание, что в приведенном выше примере я вложил две DockPanel. Этого также можно было бы достичь с помощью Grid, но разметка была бы намного более загроможденной. Если вы новичок в WPF, я бы настоятельно рекомендовал поиграть с различными панелями, которые вам доступны. Когда вы узнаете, когда применять конкретную панель к определенному макету, с WPF станет намного проще работать.

4 голосов
/ 24 ноября 2011

Немного поздно, но я хочу, чтобы это знали все.

Чтобы текстовое поле заполняло все окно и изменяло его размер, вам нужно явно установить его высоту на Авто, даже если это значение по умолчанию!

2 голосов
/ 18 июня 2014

Это может быть немного сложно из-за нескольких ограничений.

  1. Текстовое поле, в котором вы не можете установить ширину автоматически (в моем случае, если одна копия копирует длинную строку, она выходит за границы из-за автоматической ширины),
  2. Я не могу оставить его по умолчанию, потому что в случае отсутствия текста он очень мал по ширине, поэтому мне нужен MinWidth.
  3. В то же время у вас должно быть статическое представление ширины, потому что мы хотим обернуть текст для определенной строки.

Я попробовал это решение, которое делает вашу ширину ограниченной родительским (я согласен, что могут быть и лучшие решения, но это было легко и работало нормально)

<Grid>
    <Grid.ColumnDefinitions>
      <ColumnDefinition Width="*" Name="LeftColumnDefinition" />
      <ColumnDefinition Width="150" />
    </Grid.ColumnDefinitions>
    <Grid.RowDefinitions>
      <RowDefinition Height="Auto" />
    </Grid.RowDefinitions>
    <TextBox Grid.Column="0" BorderThickness="3" VerticalScrollBarVisibility="Auto" HorizontalAlignment="Stretch" ClipToBounds="True"
                         TextWrapping="Wrap" Width= "{Binding ElementName=LeftColumnDefinition, Path=Width}"  MinWidth="560" MinHeight="57" AcceptsTab="True" Foreground="{StaticResource darkBlueBrush}">FIX message... </TextBox>
     <Button Margin="2,0,0,0"  Grid.Column="1" Content="Publish FIX Message" Name="PublishFIX" Click="publishFix_Click" HorizontalAlignment ="Center" Height="25"/>

</Grid>

Так что толькохорошо, что я сделал, я скомпоновал

Width = "{Binding ElementName = LeftColumnDefinition, Path = Width}"

до <ColumnDefinition Width="*" Name="LeftColumnDefinition" />

0 голосов
/ 21 декабря 2010

Один из методов - привязать высоту и ширину TextBox к высоте и ширине окна, например:

<TextBox Height={Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}, Path=Height} />

Может существовать другое свойство, котороеВозможно, вы захотите привязать или вы можете использовать выражение, чтобы TextBox не точно Высота / Ширина родительского окна.Многое зависит от вашего конкретного сценария использования, но этого должно быть достаточно, чтобы начать работу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...