在加载时自动调整TextBox宽度 - >然后修复大小

时间:2013-01-20 23:21:49

标签: c# wpf textbox width autosize

对于使用C#的wpf来说,这是一个新手问题。

我有TextBox,用户可以输入时间。由于字体大小可能不同,我希望TextBox在表单加载时自动调整为其初始值“00:00:00”。

之后,我不想调整大小,因为如果TextBox调整用户输入大小,它看起来很奇怪。

目前我在xaml文件中定义:

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

这样,TextBox将自动调整为当前内容。

为了防止在表单可见后调整大小,我使用:

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

这给了我想要的结果。

但是,仅通过设置xaml属性也是一样的吗?

2 个答案:

答案 0 :(得分:0)

我认为您需要使用当前字体确定文本的宽度,并将该大小设置为TextBox宽度。您可以使用FormattedText类测量文本宽度(请参阅FormattedText Methods)。

答案 1 :(得分: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如果是&gt; 0

转换器实际上会被调用两次,第二次使用正确的值,这将在文本框的Width属性中设置。