2014-01-09 30 views
0

我一直有一個問題,我希望我的應用程序中的文本框動態調整窗口大小,但不會在用戶輸入文本時展開。動態大小的文本框不會隨輸入擴展?

但是在搜索之後,似乎沒有通用的解決方案來修復應用程序中的所有文本框,但沒有爲文本框的MaxWidthMaxHeight屬性添加XAML綁定。

所以我創建了以下控制到Measure()來電後自動鎖定一個文本框尺寸:

<TextBox x:Class="GUI.Views.Controls.FixedTextBox" 
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
      xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
      xmlns:d="http://schemas.microsoft.com/expression/blend/2008"> 
</TextBox> 

public partial class FixedTextBox : TextBox 
    { 
     public FixedTextBox() 
     { 
      InitializeComponent(); 
     } 

     protected override Size MeasureOverride(Size constraint) 
     { 
      UnboundDimensions(); 
      var measured = base.MeasureOverride(constraint); 
      BoundDimensions(); 
      return measured; 
     } 

     private void UnboundDimensions() 
     { 
      MaxWidth = Double.PositiveInfinity; 
      MaxHeight = Double.PositiveInfinity; 
     } 

     private void BoundDimensions() 
     { 
      MaxWidth = ActualWidth > 0 ? ActualWidth : Double.PositiveInfinity; 
      MaxHeight = ActualHeight > 0 ? ActualHeight : Double.PositiveInfinity; 
     } 
    } 

這個解決方案工作得很好,但我不知道是否有可能更好之前我通過我的XAML代碼並將文本框更改爲我的自定義控件....?

編輯(問題舉例):https://dl.dropboxusercontent.com/u/28956841/TextBoxTrouble.zip

<Window x:Class="TextBoxTrouble.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="MainWindow" Height="150" Width="500"> 

    <ScrollViewer HorizontalScrollBarVisibility="Auto" 
        VerticalScrollBarVisibility="Auto"> 
     <Grid Grid.IsSharedSizeScope="True"> 
      <Grid.ColumnDefinitions> 
       <ColumnDefinition SharedSizeGroup="Labels"></ColumnDefinition> 
       <ColumnDefinition></ColumnDefinition> 
       <ColumnDefinition Width="5"></ColumnDefinition> 
       <ColumnDefinition SharedSizeGroup="Labels"></ColumnDefinition> 
       <ColumnDefinition Width="2*"></ColumnDefinition> 
      </Grid.ColumnDefinitions> 

      <Grid.RowDefinitions> 
       <RowDefinition Height="40"></RowDefinition> 
       <RowDefinition></RowDefinition> 
      </Grid.RowDefinitions> 

      <Label Grid.Column="0" 
        Grid.Row="0" 
        VerticalContentAlignment="Center">Label 1</Label> 
      <TextBox Grid.Column="1" 
        Grid.Row="0" 
        Margin="10">Some text</TextBox> 

      <Label Grid.Column="3" 
        Grid.Row="0" 
        VerticalContentAlignment="Center">Label 2</Label> 
      <TextBox Grid.Column="4" 
        Grid.Row="0" 
        Grid.RowSpan="2" 
        Margin="10" 
        VerticalScrollBarVisibility="Auto" 
        HorizontalScrollBarVisibility="Disabled" 
        AcceptsReturn="True" 
        TextWrapping="Wrap">Some multiline text</TextBox> 
     </Grid> 
    </ScrollViewer> 
</Window> 
+1

我不認爲我曾經遇到過你描述的問題。你能發佈一個小而完整的程序來證明你正在描述的這種行爲嗎?一個'MainWindow.xaml'和'.cs'會很好。我懷疑問題可能出現在「TextBox」的父級。 – Steve

+0

同意@Steve。我從來沒有一個文本框自動擴展來填充內容。其他事情正在發生。按照要求向我們展示您的xaml文件。 – Thraka

+0

下面是該問題的示例:https://dl.dropboxusercontent.com/u/28956841/TextBoxTrouble.zip –

回答

1

在您發佈(所有必要張貼我找到你的問題是MainWindow.xaml的內容)的代碼的問題是,你需要爲您的最外層ScrollViewer設置HorizontalScrollBarVisibility="Disabled"

<Window x:Class="TextBoxTrouble.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="MainWindow" Height="150" Width="500"> 

    <ScrollViewer HorizontalScrollBarVisibility="Auto" <!-- THIS LINE --> 
        VerticalScrollBarVisibility="Auto"> 
+0

看看這個例子,你可能必須運行它,因爲這種行爲並不是我期望的XAML。我認爲這與使用'Grid.IsSharedSizeScope'有關...... –

+0

請參閱我的編輯。這是一個非常簡單的解決方案。 – Steve

+0

我需要在兩個方向的滾動條悲傷,否則它會是這麼簡單,但問題也是在垂直方向,視圖這是一部分的容器託管其他視圖,其中一些是相當大的。 –

相關問題