【问题标题】:Wpf custom control template - relative font sizeWpf 自定义控件模板 - 相对字体大小
【发布时间】:2010-09-23 15:04:11
【问题描述】:

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

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

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

【问题讨论】:

    标签: wpf templates custom-controls


    【解决方案1】:

    更通用的方式

    值转换器

    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}" />
    

    【讨论】:

    • 我实际上会更进一步,并使其使用针对比例的乘法(0.0-1.0 或 0-100%)。这样,它是一个“真正的”相对尺寸。毕竟,如果字体大小为 20 并且您减去 10,则产生 10 或 50% 的大小。但如果你是 40 并减去 10,你的体型只有 30% 或 75%。使用缩放值,您可以始终保持大小比例。
    • 这么多代码才能实现如此微不足道的效果... WPF 一般有问题吗?
    【解决方案2】:

    我使用 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>
    

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

    【讨论】:

    • 对我来说看起来不错,我要做的唯一更改是通过 ConverterParameter 传递添加到 FontSize 的值,而不是在转换器中对其进行硬编码。
    • 正如 Ian 所说,我会添加一个 ConverterParameter 但否则看起来不错。
    • 我试过这个解决方案,但它什么也没做。值转换器永远不会被调用。
    猜你喜欢
    • 1970-01-01
    • 2015-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多