Как я могу иметь ifdefs в XAML - PullRequest
1 голос
/ 17 декабря 2009

У меня много кода XAML, и я хотел бы остаться совместимым с WPF 3.0, используя возможности WPF 4.0 Например, я хотел бы использовать UseLayoutRounding, если он доступен. Конечно, я мог бы сделать это в C #:

void SetProperty(..)
{
    #if WPF4
     set property
    #endif
}

Есть ли элегантный способ выполнить то же самое в XAML?

Ответы [ 3 ]

3 голосов
/ 17 декабря 2009

Я думаю, что вы можете решить вашу проблему с помощью класса, расширяющего MarkupExtension:

[MarkupExtensionReturnType(typeof(bool))]
public class IsWPF4Extension : MarkupExtension
{
    public override object ProvideValue(IServiceProvider serviceProvider)
    {
    #if WPF4
        return true;
    #endif
        return false;
    }
}

, чем в XAML вы можете использовать его так:

<MyControl UseLayoutRounding="{IsWPF4}"/>
1 голос
/ 17 декабря 2009

Я бы сделал это программно, потому что таким образом вам не нужно трогать ваш код xaml.

Вызовите этот метод после инициализации корневого макета и установки всех необходимых вещей в wpf 4.

public static void SetLayoutRounding(Visual visual)
    {
        if (visual is UIElement)
            (visual as UIElement).SetValue(UseLayoutRoundingProperty, true);   

        for (var i = 0; i < VisualTreeHelper.GetChildrenCount(visual); i++)
        {
            var child = VisualTreeHelper.GetChild(visual, i);
            if(child is Visual)
                SetLayoutRounding((Visual)child);
        }
    }
0 голосов
/ 17 декабря 2009

Если вы просто хотите использовать свойство «UseLayoutRounding», вам не нужно.

Поскольку это значение по умолчанию равно true, и Microsoft не предлагает отключить его, а также не предлагает явно установить его в значение true.

...