Wpf自定义控件模板 - 相对字体大小

Bil*_*ill 6 wpf templates custom-controls

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

如何使用相对值在控件模板中为头元素指定字体大小,而不向用户公开类似"TitleFontSize"的属性?我想做"加5".

我尝试在标题文本块上使用ScaleTransform并使用混合结果(文本块缩放得很好,但方向已被修改 - 我将文本右对齐,并在缩放时移出"离开控件"区域).另外,我不确定缩放变换是否适合这里.

Tho*_*mas 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

转换器资源

<my:MathConverter x:Key="MathConverter" />
Run Code Online (Sandbox Code Playgroud)

XAML

<TextBlock FontSize="{Binding
                     RelativeSource={RelativeSource AncestorType={x:Type Window}},
                     Path=FontSize,
                     Converter={StaticResource MathConverter},
                     ConverterParameter=2}" />
Run Code Online (Sandbox Code Playgroud)

  • 这么多代码对于这样一个微不足道的影响......一般来说WPF有问题吗? (4认同)
  • 我实际上更进一步,使用倍数对比度(0.0-1.0或0-100%).这样一来,它就是一个"真正的"相对尺寸.总而言之,如果字体大小为20而你减去10,则产生10或50%的大小.但是如果你在40并且减去10,你只有30或75%的大小.使用缩放值可以始终保持大小比例. (3认同)

Bil*_*ill 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
}
Run Code Online (Sandbox Code Playgroud)

接下来,我在控件的XAML模板中声明了此类的实例:

<Style.Resources>
        <local:FontSizeConverter x:Key="fontSizeConverter"/>
</Style.Resources>
Run Code Online (Sandbox Code Playgroud)

而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>
Run Code Online (Sandbox Code Playgroud)

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