我尝试将XAML C#Windows运行时应用中的textbox
元素的左右填充设置为相同元素宽度的百分比(10%),因此当元素与窗口一起调整大小时,填充会更改以进行补偿。这样做的最佳方式是什么?
我尝试通过为textbox
元素制作自定义模板并将包含正确列定义的网格放在ScrollViewer
内以及新ContentPresenter
来尝试这样做元件。但是,由于某些原因我无法理解,将name
的{{1}}属性移动到新创建的ScrollViewer
会导致性能显着下降。如果有更好的方法,我希望尽可能使用默认模板。
提前感谢任何建议。
答案 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}" />