计算XAML元素的内边距占其宽度的百分比

本文关键字:百分比 XAML 元素 计算 | 更新日期: 2023-09-27 18:12:57

我试图在XAML c# Windows运行时应用程序中设置textbox元素的左和右填充为相同元素宽度的百分比(10%),以便当元素随窗口调整大小时,填充变化以补偿。最好的方法是什么?

我试图通过为textbox元素制作自定义模板并在ScrollViewer内放置具有正确列定义的网格以及新的ContentPresenter元素来做到这一点。然而,由于某些我无法理解的原因,将ScrollViewername属性移动到新创建的ContentPresenter会导致性能的重大损失。如果有更好的方法,我更愿意使用默认模板。

提前感谢您的建议

计算XAML元素的内边距占其宽度的百分比

您可以创建一个ValueConverter,它接受您想要匹配宽度的元素。然后在文本框中,使用ValueConverter将padding与元素绑定。

像这样:

public sealed class PercentageOfValueConverter : IValueConverter
{
    private const double DefaultValue = 150;
    private const double Percentage = 0.9;
    public object Convert(object value, Type targetType, object parameter, string language)
    {
        double result = 0;
        double.TryParse(value.ToString(), out result);
        if (result == double.NaN)
        {
            return DefaultValue; // Default value.
        }
        // Thickness gets assigned to the Padding property.
        return new Thickness(result * Percentage, 0, result * Percentage, 0);
    }
    public object ConvertBack(object value, Type targetType, object parameter, string language)
    {
        throw new NotImplementedException();
    }
}

然后通过将文本框的内边距绑定到它来使用转换器。为转换器提供了绑定路径,在本例中是网格。宽度属性。我们可以把这个值的90%作为一个Thickness对象返回,然后赋值给padding属性。

<Grid x:Name="LayoutRoot">
    <Grid.Resources>
        <local:PercentageOfValueConverter x:Key="PercentageOfValueConverter" />
    </Grid.Resources>
    <TextBox Padding="{Binding ElementName=LayoutRoot, 
                    Converter={StaticResource PercentageOfValueConverter}, 
                    Path=Width, Mode=TwoWay, 
                    UpdateSourceTrigger=PropertyChanged}" />