TextOptions.TextFormattingMode и WPF 3.5
Меня всегда убивало качество шрифтов в WPF и Silverlight, но слава Вселенной, что с приходом WPF 4.0 появилось замечательное attached-свойство TextOptions.TextFormattingMode
, задав которое в значение Display
можно получить качество шрифтов, неотличимое от GDI’ного. Однако по понятным причинам им невозможно воспользоваться в приложениях, собранных под WPF 3.5, но запускающихся в большинстве случаев под WPF 4.0, что крайне обидно. Решается рефлексией и утилкой, которой мне зачем-то захотелось с вами поделиться:
public enum TextFormattingModeWPF4 { Ideal, Display }
public static class TextOptionsWPF4 {
public static readonly DependencyProperty TextFormattingModeProperty;
static TextOptionsWPF4() {
try {
// PresentationFramework.dll
var assembly = typeof(System.Windows.Application).Assembly;
var textOptionsType = assembly.GetType("System.Windows.Media.TextOptions");
if (textOptionsType == null) return;
var property = textOptionsType.GetField(
"TextFormattingModeProperty", BindingFlags.Public | BindingFlags.Static);
if (property == null) return;
TextFormattingModeProperty = property.GetValue(null) as DependencyProperty;
}
catch (Exception) { }
finally {
TextFormattingModeProperty = TextFormattingModeProperty ??
DependencyProperty.RegisterAttached(
"TextFormattingMode", typeof(TextFormattingModeWPF4), typeof(TextOptionsWPF4),
new PropertyMetadata(TextFormattingModeWPF4.Ideal));
}
}
public static TextFormattingModeWPF4 GetTextFormattingMode(UIElement element) {
return (TextFormattingModeWPF4) element.GetValue(TextFormattingModeProperty);
}
public static void SetTextFormattingMode(UIElement element, TextFormattingModeWPF4 value) {
var val = Enum.ToObject(TextFormattingModeProperty.PropertyType, (int)value);
element.SetValue(TextFormattingModeProperty, val);
}
}