【问题标题】:How can I have ifdefs in XAML如何在 XAML 中拥有 ifdef
【发布时间】:2010-12-27 11:24:19
【问题描述】:

我有很多 XAML 代码,并希望在利用 WPF 4.0 功能的同时保持与 WPF 3.0 的兼容性。例如,如果可用,我想使用UseLayoutRounding。当然,我可以在 C# 中做到这一点:

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

在 XAML 中是否有一种优雅的方式来完成同样的事情?

【问题讨论】:

标签: wpf xaml conditional-compilation


【解决方案1】:

我认为您可以通过扩展 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}"/>

【讨论】:

  • 很好的解决方案,我喜欢这种语法
  • 这并不能解决我的问题,因为 WPF 3.0 中没有定义 UseLayoutRounding
【解决方案2】:

我会像编程一样进行,因为这样你就不必接触你的 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);
        }
    }

【讨论】:

    【解决方案3】:

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

    因为这个值默认为true,微软不建议你关闭它,也不建议你显式设置为true。

    【讨论】:

    • 不正确:UseLayoutRounding 默认设置为 false。
    猜你喜欢
    • 2016-10-25
    • 1970-01-01
    • 2010-11-09
    • 1970-01-01
    • 1970-01-01
    • 2012-09-13
    • 2015-03-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多