允许调整TextBox的大小,但不要增加用户输入

Ray*_*Ray 12 wpf 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>
Run Code Online (Sandbox Code Playgroud)

问题是,当用户键入TextBox时,它会向右扩展,因为只设置了MinWidth.我真正想要的是要包装到下一行的文本.如果我将列上的MinWidth更改为Width,我可以这样做.但是,如果我这样做,那么在调整Window大小时TextBox不再调整大小.

有没有办法可以兼顾两者?(即仅在Window调整大小时调整大小,否则换行)

Gis*_*shu 15

你有这种行为的原因是因为你设置了Window的SizeToContent属性 - 它基本上授权Window根据其内容请求的大小调整自身大小.因此,当您输入更多内容时,文本框说我需要更多空间,窗口会顺从地增长.如果未设置SizeToContent属性,则文本框不会增长.

所以我会说丢失SizeToContent属性setter和使用比例网格大小.在这里,我说使第2列的宽度为第1列的宽度.Grid的Horizo​​ntalAlignment和VerticalAlignment的默认"Stretch"值应确保控件在窗口大小调整时正确调整大小.

<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>
Run Code Online (Sandbox Code Playgroud)

如果你只是将SizeToContent属性setter添加回上面的代码片段...你会看到文本框最初随文本内容增长的一些奇怪的行为..但是如果你调整窗口大小一次......文本框将停止增长.奇怪......无法解释那种行为.
HTH


aja*_*rov 5

WPF 的 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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

然后,在 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>
Run Code Online (Sandbox Code Playgroud)