Шаблон пользовательского элемента управления Wpf - относительный размер шрифта
Я создаю пользовательский элемент управления WPF, который, скажем для простоты, имеет вертикальную панель стека с "заголовком" TextBlock, за которым следует ContentPresenter. Я хочу, чтобы размер шрифта для "заголовка" был на 5 пунктов БОЛЬШЕ, чем размер, используемый в контенте, который наследуется любым контейнером, в который пользователь помещает этот элемент управления.
Как я могу указать размер шрифта в шаблоне элемента управления для элемента заголовка, используя относительное значение, не выставляя пользователю свойство "TitleFontSize"? Я хочу сделать "добавить 5".
Я попытался использовать ScaleTransform для текстового блока заголовка со смешанными результатами (текстовый блок масштабировался нормально, но ориентация была изменена - у меня был текст, выровненный по правому краю, и он масштабировался в области "вне контроля" при масштабировании). Кроме того, я не уверен, что масштабное преобразование будет уместным здесь.
2 ответа
Я сделал это с 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>
Это работает. Но я до сих пор не знаю, правильный ли это ответ. Дайте мне знать, если есть лучший способ, или если это уместно.
Более общий способ
Преобразователь стоимости
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}" />