Wpf custom control template - relative font size

前端 未结 2 1437
情书的邮戳
情书的邮戳 2020-12-18 03:37

I am creating a custom WPF control that let\'s say for simplicity sake has a vertical stack panel with a \"title\" TextBlock, followed by a ContentPresenter. I want the font

相关标签:
2条回答
  • 2020-12-18 04:26

    A more generic way

    Value converter

    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;
        }
    }
    

    Converter Resource

    <my:MathConverter x:Key="MathConverter" />
    

    XAML

    <TextBlock FontSize="{Binding
                         RelativeSource={RelativeSource AncestorType={x:Type Window}},
                         Path=FontSize,
                         Converter={StaticResource MathConverter},
                         ConverterParameter=2}" />
    
    0 讨论(0)
  • 2020-12-18 04:32

    I did it with an IValueConverter as follows:

    Created a class FontSizeConverter that derives from IValueConverter. The Convert method adds 10 to the value, and the ConvertBack method subtracts 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
    }
    

    Next, I declaried an instance of this class in the XAML template for the control:

    <Style.Resources>
            <local:FontSizeConverter x:Key="fontSizeConverter"/>
    </Style.Resources>
    

    And Finnaly, the FontSize binding uses this converter applied to the inherited FontSize property:

    <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>
    

    This works. But I still do not know if this is the correct answer. Let me know if there is a better way, or if this is appropriate.

    0 讨论(0)
提交回复
热议问题