如何在 XAML 中添加 ifdef

发布于 2024-08-15 07:08:15 字数 252 浏览 6 评论 0原文

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

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

是否有一种优雅的方法可以在 XAML 中完成相同的操作?

I have a lot of XAML code and would like to stay compatible with WPF 3.0 while taking advantage of the WPF 4.0 features. For example, I'd like to use UseLayoutRounding if it's available. Of course, I could do this in C#:

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

Is there an elegant way to accomplish the same thing in XAML?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

感情废物 2024-08-22 07:08:16

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

I would do it programmatically like, because this way you dont have to touch your xaml code.

Call this method after you initialized your layout root and set all the things you need in 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);
        }
    }
原谅我要高飞 2024-08-22 07:08:16

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

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

If you just want to use "UseLayoutRounding" property, you don't need to.

Because this value is true by default and Microsoft doesn't suggest you to turn it off, and also doesn't suggest you to explicitly set it to true.

格子衫的從容 2024-08-22 07:08:15

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

I think you can solve your problem with a class extending MarkupExtension:

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

than in XAML you can use it like that:

<MyControl UseLayoutRounding="{IsWPF4}"/>
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文