如何在XAML中使用ifdef

时间:2009-12-16 23:31:47

标签: wpf xaml conditional-compilation

我有很多XAML代码,并希望在利用WPF 4.0功能的同时保持与WPF 3.0兼容。例如,如果可用,我想使用UseLayoutRounding。当然,我可以在C#中执行此操作:

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

在XAML中有没有一种优雅的方法来完成同样的事情?

3 个答案:

答案 0 :(得分:3)

我认为您可以使用扩展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 :(得分:1)

我会以编程方式执行此操作,因为这样您就不必触摸您的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);
        }
    }

答案 2 :(得分:0)

如果您只想使用“UseLayoutRounding”属性,则不需要。

因为默认情况下此值为true,并且Microsoft不建议您将其关闭,并且也不建议您将其明确设置为true。