2009-03-17 18 views

Respuesta

2

AFAIK, no hay uno ahora mismo. Pero puede hacer que su deseo sea conocido here.

Una alternativa (y no sé si esto también es posible) sería medir qué tan grande es la fuente deseada, luego tomar esa como su unidad "ems", luego escalar usando esas "unidades".

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

parece ser más o menos la alternativa de 1.2em.

1

Desafortunadamente, no hay un equivalente en WPF de la unidad em. Todos los tamaños de fuente, etc. siempre se configuran en píxeles.

5

tamaño em es la anchura de la letra M mayúscula en la fuente de corriente, no hay ningún método apresto de la fuente dependiente en Wpf

BTW, WPF utiliza "dispositivo píxeles independientes" que son siempre 1/96 de una pulgadas (porque es uno pixeles en monitores de hoy en día) así:

  • 1 píxel es 1/96 pulgadas
  • 96 píxeles en una pulgada
  • 1.33333 píxeles es un punto
  • 3,779 p ixels es un mm

Esos son muy inexactos en los monitores porque casi todos los monitores informan una resolución de 96 ppp e ignoran el tamaño de píxel real, pero son muy útiles al imprimir.

7

Esto es lo que hice. Se creó una MarkupExtension que convierte el tamaño de la fuente en EM en función de la fuente asignada en la ventana.

Me gustaría dar las gracias http://10rem.net/blog/2011/03/09/creating-a-custom-markup-extension-in-wpf-and-soon-silverlight

y

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

para proporcionar el conocimiento necesario.

[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); 
    } 
} 

Uso Muestra

xmlns:my="clr-namespace:FontSizeExample" 
<TextBlock Text="Sample Font" FontSize="{my:EmFontSize 1.1}"/> 
<TextBlock Text="Sample Font" FontSize="{my:EmFontSize .9}"/> 
Cuestiones relacionadas