2013-01-20 46 views
0

這是一種新手問題的使用C#WPF。上負載自動調整文本框寬度 - >然後固定大小

我有一個TextBox,在這裏用戶可以輸入一個時間。由於字體大小可能不同,我希望TextBox在窗體加載時自動調整爲初始值「00:00:00」。

在那之後,我不想改變大小,因爲它看起來很奇怪,如果TextBox調整大小的用戶輸入。

目前我定義在XAML文件:

<TextBox Text="00:00:00" Name="myTextBox" /> 

這樣做,文本框會自動調整到目前的內容。

爲了防止其調整後的形式是可見的,我用:

private void Window_Loaded(object sender, RoutedEventArgs e) 
{ 
    myTextBox.Width = myTextBox.ActualWidth; 
} 

這給了我想要的結果。

然而,同樣是可能只是通過設置XAML屬性?

回答

0

我認爲你需要確定與當前字體的文本的寬度,以及大小設置爲TextBox寬度。您可以使用FormattedText類來測量文本寬度(請參閱FormattedText Methods)。

+0

這將涉及編碼以及。 –

0

在XAML這樣做的問題是,Width綁定到ActualWidth時的ActualWidth初始值通常爲0,所以它會將您的寬度設置爲0。

這可以很容易地通過使用來解決一個Converter

所以創建TextBox這樣的:

<TextBox Text="00:00:00" Name="myTextBox" Width="{Binding Path=ActualWidth, RelativeSource={RelativeSource Self}, Converter={StaticResource widthConverter}}" /> 

現在你的轉換器應該是這樣的:

class WidthConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     double actualWidth; 

     if (Double.TryParse(value.ToString(), out actualWidth)) 
     { 
      if (actualWidth> 0) 
      { 
       return actualWidth; 
      } 
     } 
     return null; 
    } 
} 

換句話說,僅返回ActualWidth如果是> 0

轉換器實際上會被調用兩次,第二次使用正確的值,這將在文本框的中設置財產。

+0

這是不正確的,'ActualWidth'返回控件的渲染大小,如果你明確地將'Width'設置爲0,它將只會是0.如果你沒有在控件上設置'Width','Width'將總是'Double.NaN'。 –

+0

@ sa_ddam213我只是再次檢查,以確保 - 第一次調用轉換器時,我得到0.0作爲ActualWidth的值... – Blachshma

+0

這就是爲什麼OP在他的加載事件中有代碼,以確保文本框已加載(內容)寬度設置爲'ActualWidth'之前,但是如果ActualWidth改變,轉換器不會設置文本框的寬度嗎?即:輸入更長的文本? –

相關問題