2014-07-14 102 views
0

我试图在XAML C#Windows运行时应用程序中将textbox元素的左侧和右侧填充设置为相同元素的百分比(10%)宽度,以便在元素随窗口一起调整大小时,填充更改为补偿。做这个的最好方式是什么?计算XAML元素的填充宽度的百分比

我试过这样做,通过为textbox元素制作一个自定义模板,并将ScrollViewer中正确的列定义以及新的ContentPresenter元素与正确的列定义放在一起。但由于某些原因,我无法理解,将ScrollViewername属性移至新创建的ContentPresenter会导致性能严重下降。如果有更好的方法,我宁愿如果可能的话使用默认模板。

在此先感谢您的任何建议。

回答

0

您可以创建一个ValueConverter,它接受要匹配宽度的元素。然后在文本框中,使用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属性。我们可以将其作为Thickness对象返回该值的90%,然后将其分配给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}" />