我正在创建一个自定义WPF控件,为简单起见,我们假设有一个带有“标题”TextBlock的垂直堆栈面板,后跟一个ContentPresenter。我希望“标题”的字体大小比内容中使用的大小大5个点,这是由用户放置此控件的任何容器继承的。
如何使用相对值在控件模板中为header元素指定字体大小,而不向用户公开类似“TitleFontSize”的属性?我想做“加5”。
我尝试在标题文本块上使用ScaleTransform并使用混合结果(文本块缩放得很好但方向已修改 - 我将文本右对齐并在缩放时将其移出“控制”区域)。另外,我不确定缩放变换是否适合这里。
答案 0 :(得分:13)
更通用的方法
价值转换器
public class MathConverter : IValueConverter
{
public object Convert( object value, Type targetType, object parameter, CultureInfo culture )
{
return (double)value + double.Parse( parameter.ToString() );
}
public object ConvertBack( object value, Type targetType, object parameter, CultureInfo culture )
{
return null;
}
}
转换器资源
<my:MathConverter x:Key="MathConverter" />
<强> XAML 强>
<TextBlock FontSize="{Binding
RelativeSource={RelativeSource AncestorType={x:Type Window}},
Path=FontSize,
Converter={StaticResource MathConverter},
ConverterParameter=2}" />
答案 1 :(得分:5)
我使用IValueConverter完成了如下操作:
创建了一个派生自IValueConverter的FontSizeConverter类。 Convert方法将值加10,ConvertBack方法减去10。
public class FontSizeConverter : IValueConverter
{
#region IValueConverter Members
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
return (double)value + 12.0;
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
return (double)value - 12.0;
}
#endregion
}
接下来,我在控件的XAML模板中声明了此类的实例:
<Style.Resources>
<local:FontSizeConverter x:Key="fontSizeConverter"/>
</Style.Resources>
而Finnaly,FontSize绑定使用此转换器应用于继承的FontSize属性:
<TextBlock FontSize="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=FontSize, Converter={StaticResource fontSizeConverter}}"
Grid.Row="0" Text="{Binding RelativeSource={RelativeSource TemplatedParent},
Path=Date.Day}" HorizontalAlignment="Right" VerticalAlignment="Top" Padding="2" Margin="2" >
</TextBlock>
这很有效。但我仍然不知道这是否是正确的答案。让我知道是否有更好的方法,或者这是否合适。