1

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

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

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

4

3 回答 3

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}"/>
于 2009-12-17T01:19:48.713 回答
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);
        }
    }
于 2009-12-17T12:32:36.257 回答
0

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

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

于 2009-12-17T01:31:07.290 回答