加载时自动调整文本框宽度 ->然后修复大小

本文关键字:然后 调整 文本 加载 | 更新日期: 2023-09-27 17:54:53

这是使用 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 属性是否可以相同?

加载时自动调整文本框宽度 ->然后修复大小

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

在 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 时

返回。

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