代码之家  ›  专栏  ›  技术社区  ›  Ray

允许调整TextBox的大小,但不允许根据用户输入进行扩展

  •  12
  • Ray  · 技术社区  · 16 年前

    我在窗口中定义了一个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将不再调整大小。

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

    3 回复  |  直到 9 年前
        1
  •  15
  •   Gishu    16 年前

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

    所以我会说丢失SizeToContent属性设置器&使用比例网格大小。在这里,我建议将列#2的宽度设置为列#1的两倍。网格的默认“拉伸”值“水平对齐”和“垂直对齐”应确保控件在调整窗口大小时正确调整大小。

    <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属性设置器添加回上面的代码片段。..你会看到一些奇怪的行为,文本框最初会随着文本内容而增长。。但是,如果您调整一次窗口大小。文本框将停止增长。奇怪。…无法解释这种行为。
    人酪氨酸羟化酶

        2
  •  5
  •   ajarov    8 年前

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

    在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
  •  0
  •   Donnelle    16 年前

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

    推荐文章