2013-01-20 98 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改变,转换器不会设置文本框的宽度吗?即:输入更长的文本? –

相关问题