2009-03-17 2 views

ответ

2

AFAIK, сейчас нет ни одного права. Но вы можете сделать свое желание для этого известного here.

Одна из альтернатив (и я не знаю, возможно ли это)) будет измерять, насколько большой желаемый шрифт, а затем принять это как ваш блок «ems», а затем масштабировать, используя эти «единицы».

3
<ScaleTransform ScaleX="1.2" ScaleY="1.2"></ScaleTransform> 

представляется более или менее альтернативой 1.2em.

1

К сожалению, в WPF этого модуля нет эквивалента. Все ваши размеры шрифта и т. Д. Всегда устанавливаются в пикселях.

5

размер ет ширина прописной буквы M текущего шрифта, нет шрифта в зависимости от способа проклейки в Wpf

Btv, WPF использует так называемые «независимые устройства пикселей», которые всегда 1/96 из дюйм (потому что это один пикселей на современных мониторах) так:

  • 1 пиксель 1/96 дюйма
  • 96 пикселов в дюйм
  • 1.33333 пикселей является точкой
  • 3,779 р ixels - это mm

Это очень неточно на мониторах, потому что почти все мониторы сообщают о разрешении 96DPI и игнорируют реальный размер пикселя, но очень полезны при печати.

7

Вот что я сделал. Создал MarkupExtension, который преобразует размер шрифта в EM на основе шрифта, назначенного на Window.

Я хотел бы поблагодарить http://10rem.net/blog/2011/03/09/creating-a-custom-markup-extension-in-wpf-and-soon-silverlight

и

http://tomlev2.wordpress.com/tag/markup-extension/

для обеспечения необходимых знаний.

[MarkupExtensionReturnType(typeof(double))] 
public class EmFontSize : MarkupExtension 
{ 
    public EmFontSize() { } 

    public EmFontSize(double size) 
    { 
     Size = size; 
    } 

    [ConstructorArgument("size")] 
    public double Size { get; set; } 

    public override object ProvideValue(IServiceProvider serviceProvider) 
    { 
     if (serviceProvider == null) 
      return null; 

     // get the target of the extension from the IServiceProvider interface 
     IProvideValueTarget ipvt = (IProvideValueTarget)serviceProvider.GetService(typeof(IProvideValueTarget)); 
     if (ipvt.TargetObject.GetType().FullName == "System.Windows.SharedDp") 
      return this; 

     DependencyObject targetObject = ipvt.TargetObject as DependencyObject; 

     var window = TryFindParent<Window>(targetObject); 
     if (window != null) 
     { 
      return window.FontSize * Size; 
     } 
     return 12 * Size; 
    } 

    public static T TryFindParent<T>(DependencyObject child) where T : DependencyObject 
    { 
     //get parent item 
     DependencyObject parentObject = GetParentObject(child); 

     //we've reached the end of the tree 
     if (parentObject == null) return null; 

     //check if the parent matches the type we're looking for 
     T parent = parentObject as T; 
     if (parent != null) 
     { 
      return parent; 
     } 
     else 
     { 
      //use recursion to proceed with next level 
      return TryFindParent<T>(parentObject); 
     } 
    } 

    public static DependencyObject GetParentObject(DependencyObject child) 
    { 
     if (child == null) return null; 

     //handle content elements separately 
     ContentElement contentElement = child as ContentElement; 
     if (contentElement != null) 
     { 
      DependencyObject parent = ContentOperations.GetParent(contentElement); 
      if (parent != null) return parent; 

      FrameworkContentElement fce = contentElement as FrameworkContentElement; 
      return fce != null ? fce.Parent : null; 
     } 

     //also try searching for parent in framework elements (such as DockPanel, etc) 
     FrameworkElement frameworkElement = child as FrameworkElement; 
     if (frameworkElement != null) 
     { 
      DependencyObject parent = frameworkElement.Parent; 
      if (parent != null) return parent; 
     } 

     //if it's not a ContentElement/FrameworkElement, rely on VisualTreeHelper 
     return VisualTreeHelper.GetParent(child); 
    } 
} 

Пример использования

xmlns:my="clr-namespace:FontSizeExample" 
<TextBlock Text="Sample Font" FontSize="{my:EmFontSize 1.1}"/> 
<TextBlock Text="Sample Font" FontSize="{my:EmFontSize .9}"/> 
Смежные вопросы