首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >允许调整TextBox的大小,但不能根据用户输入进行增长

允许调整TextBox的大小,但不能根据用户输入进行增长
EN

Stack Overflow用户
提问于 2009-03-03 03:06:44
回答 3查看 20.4K关注 0票数 12

我在一个窗口中定义了一个TextBox,如下所示:

代码语言:javascript
复制
<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,我可以让它这样做。但是,如果我这样做,那么当调整窗口大小时,TextBox不再调整大小。

有没有办法让我两者兼得?(即仅在调整窗口大小时调整大小,否则换行)

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2009-03-03 06:32:39

之所以会出现这种情况,是因为您已经设置了窗口的SizeToContent属性-它基本上授权窗口根据其内容所请求的大小来调整自身的大小。因此,当你输入更多内容时,文本框显示我需要更多空间,窗口就会顺从地增长。如果不设置SizeToContent属性,textbox将不会增长。

所以我建议去掉SizeToContent属性设置器,使用成比例的网格大小。这里我说的是Column#2的宽度是Column#1的两倍。网格的默认“拉伸”值HorizontalAlignment和VerticalAlignment应该能确保你的控件在调整窗口大小时正确地调整大小。

代码语言:javascript
复制
<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

票数 15
EN

Stack Overflow用户

发布于 2017-02-21 22:33:29

WPF的TextBox似乎没有内置该选项。

要解决此问题,您可以使用报告所需(0,0)大小的自定义TextBox。这是一个丑陋的黑客,但它是有效的。

在MainWindow.xaml.cs文件中:

代码语言:javascript
复制
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文件中:

代码语言:javascript
复制
<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>
票数 4
EN

Stack Overflow用户

发布于 2009-03-03 04:48:36

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/604952

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档