Как изменить размер текстового поля при изменении размера окна

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

Ответ 1

Макет в 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.

Ответ 2

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

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

Ответ 3

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

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

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

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

to <ColumnDefinition Width="*" Name="LeftColumnDefinition" />

Ответ 4

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

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

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