Шаблон пользовательского элемента управления Wpf - относительный размер шрифта - PullRequest
6 голосов
/ 22 ноября 2008

Я создаю пользовательский элемент управления WPF, который, скажем для простоты, имеет вертикальную панель стека с надписью «TextBlock», за которой следует ContentPresenter. Я хочу, чтобы размер шрифта для «заголовка» был на 5 пунктов БОЛЬШЕ, чем размер, используемый в контенте, который наследуется любым контейнером, в который пользователь помещает этот элемент управления.

Как я могу указать размер шрифта в шаблоне элемента управления для элемента заголовка, используя относительное значение, не выставляя пользователю свойство "TitleFontSize"? Я хочу сделать "добавить 5".

Я попытался использовать ScaleTransform для текстового блока заголовка со смешанными результатами (текстовый блок масштабировался нормально, но ориентация была изменена - у меня был текст, выровненный по правому краю, и он масштабировался из области управления при масштабировании). Кроме того, я не уверен, что масштабное преобразование будет уместным здесь.

Ответы [ 2 ]

13 голосов
/ 03 февраля 2010

Более общий способ

Значение преобразователя

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}" />
5 голосов
/ 22 ноября 2008

Я сделал это с помощью IValueConverter следующим образом:

Создан класс FontSizeConverter, производный от IValueConverter. Метод 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>

Это работает. Но я до сих пор не знаю, правильный ли это ответ. Дайте мне знать, если есть лучший способ, или если это уместно.

...