允许调整文本框大小,但不允许根据用户输入而增长。

12

我在窗口中定义了一个文本框,就像这样:

<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>
问题在于当用户在文本框中输入时,它会向右扩展,因为只设置了MinWidth。我真正想要的是文本换行到下一行。如果我将列的MinWidth更改为Width,则可以实现这一点。但是,如果我这样做,那么当窗口大小调整时,文本框将不再自动调整大小。
有没有办法两者兼得?(即仅在窗口调整大小时调整大小,否则换行)
3个回答

15
你出现这种情况的原因是因为你设置了Window的SizeToContent属性,这基本上授权窗口根据其内容所请求的大小调整自身大小。所以随着你输入更多的东西,文本框会说我需要更多的空间,窗口就会顺从地增长。如果你不设置SizeToContent属性,你的文本框将不会增长。
所以我建议你放弃设置SizeToContent属性,并使用比例网格大小。在这里,我建议将Column#2的宽度设置为Column#1的两倍。对于网格的HorizontalAlignment和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>
如果您只是将 SizeToContent 属性设置程序添加回上面的代码段中... 您会发现文本框最初会随着文本内容而增长.. 但是,如果您调整窗口大小一次.. 文本框就会停止增长。奇怪...无法解释这种行为。
HTH

5

WPF的文本框似乎没有内置该选项。

要解决这个问题,您可以使用自定义的文本框来报告所需的(0,0)大小。这是一个丑陋的hack,但它有效。

在您的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>

这并不丑陋 - 这是处理问题的非常好的方式,也是唯一真正有效的方式。如果您有一个单行文本框,可以调用原始(基本)MeasureOverride并将宽度设置为0,以仅防止水平大小对文本内容产生影响。 - Ed Bayiates

0

将第二个ColumnDefinition的Width更改为" * "。


1
这将仍然使文本框增大。使用 * 意味着 - 使用可用宽度的其余部分作为第二列。 - Gishu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接