Аналогия с WPF для блока em - PullRequest
8 голосов
/ 17 марта 2009

Какова аналогия WPF для блока CSS em ?

Ответы [ 5 ]

10 голосов
/ 15 июня 2011

Вот что я сделал. Создано 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}"/>
6 голосов
/ 17 марта 2009

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

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

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

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

3 голосов
/ 17 марта 2009
<ScaleTransform ScaleX="1.2" ScaleY="1.2"></ScaleTransform> 

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

2 голосов
/ 17 марта 2009

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

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

1 голос
/ 17 марта 2009

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

...