2009-03-03 49 views
12

我有一个窗口内定义,像这样一个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> 

的问题是,当在文本框的用户类型也扩展到由于权利只有MinWidth被设置。我真正想要的是将文本换行到下一行。如果我将列上的MinWidth更改为Width,我可以得到它。但是,如果我这样做,那么当窗口调整大小时,TextBox不再调整大小。

我有两种方法吗? (即仅调整窗口大小,否则换行)

回答

15

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

所以我会说失去SizeToContent属性设置器&使用比例网格大小。在这里我说第2列的宽度是第1列的两倍。网格的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> 

如果你只需要添加的SizeToContent属性setter回到上面的代码片断......你会看到一些奇怪的行为,其中文本框最初增长与文本内容。但是,如果你调整窗口的大小,一旦..的文本框将停止增长。奇怪......不能解释这种行为。
HTH

0

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

+1

这仍然会增长到文本框中。使用*意味着 - 使用第二列的剩余可用宽度 – Gishu 2009-03-03 05:54:29

3

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); 
     } 
    } 
} 

然后,在你的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> 
相关问题