计算XAML元素的填充量作为其宽度的百分比

时间:2014-07-14 02:21:30

标签: c# xaml windows-runtime

我尝试将XAML C#Windows运行时应用中的textbox元素的左右填充设置为相同元素宽度的百分比(10%),因此当元素与窗口一起调整大小时,填充会更改以进行补偿。这样做的最佳方式是什么?

我尝试通过为textbox元素制作自定义模板并将包含正确列定义的网格放在ScrollViewer内以及新ContentPresenter来尝试这样做元件。但是,由于某些原因我无法理解,将name的{​​{1}}属性移动到新创建的ScrollViewer会导致性能显着下降。如果有更好的方法,我希望尽可能使用默认模板。

提前感谢任何建议。

1 个答案:

答案 0 :(得分:0)

您可以创建一个ValueConverter,它接收您想要匹配宽度的元素。然后在Textbox中,使用ValueConverter将填充绑定到元素。

这样的事情:

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();
    }
}

然后,您可以通过将文本框的填充绑定到它来使用转换器。转换器提供了绑定路径,在这种情况下,它是Grid.Width属性。我们可以接受并返回该值的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}" />