2009-03-03 54 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> 
相關問題