2008-12-22 85 views
11

我有一個問題。 我需要使用ScrollViewer中的控件託管網格,以防止文本框被截斷或摺疊爲零 - 在UI中。另外我希望當用戶改變窗口寬度時可以擴展文本框。 我窗口的內容設置爲下面的代碼WPF文本框和滾動行爲

<DockPanel> 
    <TreeView DockPanel.Dock="Left" Width="150"/> 
    <ScrollViewer VerticalScrollBarVisibility="Auto" HorizontalScrollBarVisibility="Auto"> 
     <Grid> 
      <Grid.ColumnDefinitions> 
       <ColumnDefinition Width="Auto"/> 
       <ColumnDefinition /> 
      </Grid.ColumnDefinitions> 
      <Grid.RowDefinitions> 
       <RowDefinition Height="Auto"/> 
      </Grid.RowDefinitions> 
      <TextBlock Text="Name" 
         Margin="5" 
         VerticalAlignment="Center"/> 
      <TextBox Grid.Column="1" 
        Text="Some Name" 
        Margin="5" 
        VerticalAlignment="Center" 
        MinWidth="200"/> 
     </Grid> 
    </ScrollViewer> 
</DockPanel> 

所有的工作很好,但是當用戶在文本框很長的文本它正在擴大,並出現橫向滾動。 是否有任何簡單的方法來限制TextBox的最大寬度,並允許僅在用戶更改窗口大小時才展開它。

回答

31

問題是,父元素提供了足夠多的空間,因爲它認爲它需要,當更多的文本存在時,它將擴大,而不是停留在初始自動大小。這裏

一種解決方案是使另一汽車大小的元素並綁定TextBox.Width它:

<DockPanel> 
    <TreeView Width="150" DockPanel.Dock="Left"/> 
    <ScrollViewer HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Auto"> 
     <Grid> 
      <Grid.ColumnDefinitions> 
       <ColumnDefinition Width="Auto"/> 
       <ColumnDefinition/> 
      </Grid.ColumnDefinitions> 
      <Grid.RowDefinitions> 
       <RowDefinition Height="Auto"/> 
      </Grid.RowDefinitions> 
      <TextBlock Margin="5" VerticalAlignment="Center" Text="Name"/> 
      <Border x:Name="b" Grid.Column="1" Margin="5"/> 
      <TextBox Width="{Binding ActualWidth, ElementName=b}" 
        MinWidth="200" 
        Grid.Column="1" 
        Margin="5" 
        VerticalAlignment="Center" 
        Text="Some Name"/> 
     </Grid> 
    </ScrollViewer> 
</DockPanel> 

注意,我們設置了自動調整大小的元素(境)的保證金性質。這很重要,因爲如果它沒有設置,會出現一個循環:

  1. 邊框寬度自動調整大小以網格列寬度
  2. 文本框的寬度調整大小以Border.ActualWidth
  3. 格列寬調整大小以文本框寬度+文本框緣
  4. 邊框寬度自動調整大小以網格列寬再次

與裕爲文本框設置爲相同的,文本框的大小調整不會影響GRI的d尺寸。

+0

謝謝...這是偉大的! – Jose 2010-01-27 19:20:24

+1

根據Robert的解決方案修改代碼後,我發現將文本框的MaxWidth綁定到封閉元素很有用。它似乎避免了某些應用程序的無限調整大小循環的問題。 – estanford 2010-08-06 12:37:02

0

否 - 這是一個衆所周知的wpf問題,預計將在下一個版本中修復。感謝

2

重寫TextBox.MeasureOverride,像這樣的工作對我來說:

protected override Size MeasureOverride(Size constraint) 
{ 
    Size origSize = base.MeasureOverride(constraint); 
    origSize.Width = MinWidth; 
    return origSize; 
}