Разрешить изменение размера TextBox, но не увеличиваться при вводе пользователя

У меня есть TextBox, определенный внутри окна, например:

<Window x:Class="NS.MainWindow"
    ...
    SizeToContent="WidthAndHeight">
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="100" />
            <ColumnDefinition MinWidth="200" />
        </Grid.ColumnDefinitions>
        <Grid.RowDefinitions>
            <RowDefinition MinHeight="50" />
        </Grid.RowDefinitions>
        <TextBlock Grid.Column="0" Grid.Row="0">Description:</TextBlock>

        <TextBox Grid.Column="1" Grid.Row="0" TextWrapping="WrapWithOverflow" />
    </Grid>
</Window>

Проблема заключается в том, что когда пользователь вводит текст в TextBox, он расширяется вправо, поскольку устанавливается только MinWidth. Я действительно хочу, чтобы текст переносился на следующую строку. Я могу заставить его сделать это, если вместо этого изменить MinWidth на столбце, где будет Width. Однако, если я это сделаю, тогда TextBox больше не изменяет размеры при изменении размера окна.

Есть ли способ, которым я могу иметь оба? (т.е. изменять размер только при изменении размера окна, иначе обернуть).

Ответ 1

Причина, по которой у вас возникло такое поведение, заключается в том, что вы установили свойство Window SizeToContent, которое в основном разрешает Окну изменять размер в зависимости от размера, запрашиваемого его содержимым. Так как вы вводите больше вещей, текстовое поле говорит, что мне нужно больше места, окно послушно растет. Ваше текстовое поле не будет расти, если вы не установите свойство SizeToContent.

Таким образом, я бы сказал, потеряет свойство SetToontent Setter и использует пропорциональный размер сетки. Здесь я говорю, чтобы сделать столбец № 2 в два раза больше ширины столбца №1. Значение по умолчанию "Stretch" ​​для HorizontalAlignment и VerticalAlignment для сетки должно гарантировать, что ваши элементы управления будут правильно изменять размер окна.

<Window ...
    Title="MyWindow" WindowStyle="ToolWindow" ResizeMode="CanResizeWithGrip"
        MinWidth="300" Width="300" Height="80">
    <Grid x:Name="myGrid">
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="1*" MinWidth="100"/>
            <ColumnDefinition Width="2*" MinWidth="200" />
        </Grid.ColumnDefinitions>
        <Grid.RowDefinitions>
            <RowDefinition MinHeight="50" />
        </Grid.RowDefinitions>

        <TextBlock Grid.Column="0" Grid.Row="0">Description:</TextBlock>
        <TextBox Grid.Column="1" Grid.Row="0" TextWrapping="WrapWithOverflow"/>
    </Grid>

Если вы просто добавите свойство SetTotontontage к предыдущему фрагменту кода... вы увидите какое-то странное поведение, когда текстовое поле изначально растет с текстовым контентом. Однако если вы измените размер окна один раз... текстовое поле перестанет расти, Странно... не могу объяснить это поведение.
НТН

Ответ 2

WPF TextBox, похоже, не имеет встроенной опции.

Чтобы решить эту проблему, вы можете использовать пользовательский TextBox, который сообщает о желаемом (0, 0) размере. Это уродливый взлом, но он работает.

В файле MainWindow.xaml.cs:

namespace NS
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        ...
    }

    // Ugly HACK because the regular TextBox doesn't allow autoresize to fit the parent but NOT autoresize when the text doesn't fit.
    public class TextBoxThatDoesntResizeWithText : TextBox
    {
        protected override Size MeasureOverride(Size constraint)
        {
            return new Size(0, 0);
        }
    }
}

Затем в файле MainWindow.xaml:

<Window x:Class="NS.MainWindow"
    ...
    xmlns:local="clr-namespace:NS"
    SizeToContent="WidthAndHeight">
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="100" />
            <ColumnDefinition MinWidth="200" />
        </Grid.ColumnDefinitions>
        <Grid.RowDefinitions>
            <RowDefinition MinHeight="50" />
        </Grid.RowDefinitions>
        <TextBlock Grid.Column="0" Grid.Row="0">Description:</TextBlock>

        <local:TextBoxThatDoesntResizeWithText Grid.Column="1" Grid.Row="0" TextWrapping="WrapWithOverflow" />
    </Grid>
</Window>

Ответ 3

Измените второе значение ColumnDefinition на Width = "*".