WPF Как установить pt(12pt и т. Д.) Через DynamicResource для свойства FontSize
Я могу использовать:
<TextBlock Text="Some Textes" FontSize="12pt" />
Работает нормально. Но я хочу использовать DynamicResource
расширение, это возможно?
Это не работает:
<TextBlock Text="Some Textes" FontSize="{DynamicResource SomeResources}" />
SomeResources:
<System:Stringx:Key="SomeResources">12pt</System:String>
Я не хочу использовать AttachedBehavior
, Я знаю, я могу решить мою проблему с помощью (используя FontSizeConverter
).
2 ответа
Обновить:
Я вижу, что вы отредактировали свой вопрос и удалили обязательный вариант. Если вы хотите получить это только от ресурса xaml, вам нужно использовать MarkupExtension
, Вы можете найти MarkupExtension
и использование здесь. Это будет хорошо работать для вашего случая.
Orig ответ:
FontSize
имеет тип System:Double
Документация
Следующий по умолчанию Binding
за FontSize
Предполагается, что пиксели в масштабе, не зависящем от устройства, но так как вам нужны pt, мы можем использовать конвертер, такой как:
using System.Globalization;
using System.Windows;
using System.Windows.Data;
class ConvertFromPoint : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture) {
var convertFrom = new FontSizeConverter().ConvertFrom(value.ToString());
if (convertFrom != null)
return (double) convertFrom;
return 1;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) {
throw new NotImplementedException();
}
}
и использование:
<TextBlock FontSize="{Binding StringProperty, Converter={StaticResource ConvertFromPointConverter}}">Some Text</TextBlock>
Alternate:
Если вы не хотите использовать конвертеры и FontSizeConverter
просто сделайте расчет в вашей собственности геттер.
что-то вроде:
private double _someFontval;
public double SomeFontVal {
get {
return _someFontval * 96 / 72;
}
set {
_someFontval = value;
}
}
использование:
//.cs
SomeFontVal = 12.0;
//.xaml
<TextBlock FontSize="{Binding SomeFontVal}">Some Text</TextBlock>
Я полагаю, что вы можете просто связать его как int double
<System:Double x:Key="SomeResources">12</System:Double>