6

我正在创建一个自定义 WPF 控件,为了简单起见,它有一个带有“标题”TextBlock 的垂直堆栈面板,后跟一个 ContentPresenter。我希望“标题”的字体大小比内容中使用的大小大 5 磅,内容由用户放置此控件的任何容器继承。

如何在控件模板中使用相对值为标题元素指定字体大小,而不向用户公开诸如“TitleFontSize”之类的属性?我想做“加5”。

我尝试在标题文本块上使用 ScaleTransform 并产生混合结果(文本块缩放很好,但方向已修改 - 我让文本右对齐,并且在缩放时它“离开了控制”区域)。另外,我不确定缩放变换在这里是否合适。

4

2 回答 2

14

更通用的方法

值转换器

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}" />
于 2010-02-03T03:18:35.920 回答
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>

最后,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>

这行得通。但我仍然不知道这是否是正确的答案。让我知道是否有更好的方法,或者这是否合适。

于 2008-11-22T20:56:17.087 回答