xamarin Device.OnPlatform已弃用

mlnl4t2r  于 2023-08-01  发布在  其他
关注(0)|答案(5)|浏览(138)

在我的ContentPage的构造函数中,我尝试设置一个平台相关的填充值:

Padding = new Thickness(5, Device.OnPlatform(20, 5, 5), 5, 5);

字符串
Visual Studio给Device.OnPlatform加下划线,当我将鼠标指针悬停在方法调用上时,我得到以下警告:
Devide.OnPlatform(T,T,T)已过时:'改用开关(RuntimePlatform)'。
最初使用的代码来自2016年发布的e-book 'Creating移动的Apps with Xamarin.Forms Book'。我真的很惊讶这个平台的发展速度有多快!
不幸的是,我不知道如何Device.OnPlatform应该被替换使用的方式建议的警告。

oyxsuwqo

oyxsuwqo1#

2016年是这种方法被弃用的一年。
您应该使用switch语句来确定操作系统。

switch(Device.RuntimePlatform)
{
    case Device.iOS:
      return new Thickness(5, 5, 5, 0)
    default:
      return new Thickness(5, 5, 5, 0)
 }

字符串
你当然可以把它 Package 在一个函数中,它将完成与你希望在Device.OnPlatform中完成的工作相同的工作,但是你将调用你自己的函数,而不是调用Device.OnPlatform。

uhry853o

uhry853o2#

switch (Device.RuntimePlatform)
        {
            case Device.iOS:
                    Padding = new Thickness(5, 5, 5, 0);
                    break;

            default:
                    Padding = new Thickness(5, 5, 5, 0);
                    break;
         }

字符串

wi3ka0sx

wi3ka0sx3#

如果有人在XAML文件中有同样的问题,这是绕过弃用消息的方法:

<ContentPage.Padding>
    <OnPlatform x:TypeArguments="Thickness">
        <On Platform="iOS">0,20,0,0</On>
    </OnPlatform>
</ContentPage.Padding>

字符串

7fhtutme

7fhtutme4#

我通过使用内联三元条件运算符解决了这个问题,这假设您希望仅为iOS提供不同的内容

Padding = new Thickness(5, (Device.RuntimePlatform==Device.iOS?20:5), 5, 5);

字符串

omtl5h9j

omtl5h9j5#

这是一个令人难以置信的API,我不认为this forum中陈述的原因可以证明它的弃用。
它可以很容易地扩展到支持多个平台。我知道在不久的将来会有很多变化,但我不认为任何开发人员每次必须做出简单的决定时都会选择编写繁琐的switch语句。这样的代码会变得很庞大。
所以,我试图重建Device.OnPlatform<T>

namespace Xamarin.Forms
{
    public static class DevicePlatform
    {
        private static T OnImpl<T>(T @default = default, T iOS = default, T Android = default, Func<T> computeCustom = null)
        {
            switch (Device.RuntimePlatform)
            {
                case Device.iOS: return iOS;

                case Device.Android: return Android;

                default:
                    if (computeCustom == null) return @default;
                    return computeCustom.Invoke();
            }
        }

        public static T On<T>(T @default = default, T iOS = default, T Android = default) => OnImpl(@default, iOS, Android, null);

        public static T On<T>(T @default = default, T iOS = default, T Android = default, (string Platform, T Value) custom = default)
        {
            string runtimePlatform = Device.RuntimePlatform;

            return OnImpl(@default, iOS, Android, () =>
            {
                if (custom.Platform == runtimePlatform)
                    return custom.Value;

                return @default;
            });
        }

        public static T On<T>(T @default = default, T iOS = default, T Android = default, (string Platform, T Value) custom = default, (string Platform, T Value) custom2 = default)
        {
            string runtimePlatform = Device.RuntimePlatform;

            return OnImpl(@default, iOS, Android, () =>
            {
                if (custom.Platform == runtimePlatform)
                    return custom.Value;
                else if (custom2.Platform == runtimePlatform)
                    return custom2.Value;

                return @default;
            });
        }

        public static T On<T>(T @default = default, T iOS = default, T Android = default, (string Platform, T Value) custom = default, (string Platform, T Value) custom2 = default, (string Platform, T Value) custom3 = default)
        {
            string runtimePlatform = Device.RuntimePlatform;

            return OnImpl(@default, iOS, Android, () =>
            {
                if (custom.Platform == runtimePlatform)
                    return custom.Value;
                else if (custom2.Platform == runtimePlatform)
                    return custom2.Value;
                else if (custom3.Platform == runtimePlatform)
                    return custom3.Value;

                return @default;
            });
        }

        public static T On<T>(T @default = default, T iOS = default, T Android = default, (string Platform, T Value) custom = default, (string Platform, T Value) custom2 = default, (string Platform, T Value) custom3 = default, (string Platform, T Value) custom4 = default)
        {
            string runtimePlatform = Device.RuntimePlatform;

            return OnImpl(@default, iOS, Android, () =>
            {
                if (custom.Platform == runtimePlatform)
                    return custom.Value;
                else if (custom2.Platform == runtimePlatform)
                    return custom2.Value;
                else if (custom3.Platform == runtimePlatform)
                    return custom3.Value;
                else if (custom4.Platform == runtimePlatform)
                    return custom4.Value;

                return @default;
            });
        }

        public static T On<T>(T @default = default, T iOS = default, T Android = default, params (string Platform, T Value)[] customPlatforms)
        {
            string runtimePlatform = Device.RuntimePlatform;

            return OnImpl(@default, iOS, Android, () =>
            {
                for (int i = 0; i < customPlatforms.Length; i++)
                {
                    var platform = customPlatforms[i];
                    if (platform.Platform == runtimePlatform)
                        return platform.Value;
                }

                return @default;
            });
        }
    }
}

字符串
下面是一个关于如何使用它的示例:

Padding = new Thickness(0, DevicePlatform.On(0, iOS: 20, Android: 0, custom: (Device.Tizen, 34)));


正如你所看到的,我们很酷的API又回来了,Tizen永远被人们记住。
我计划做一个微型金块包出来,所以我愿意接受任何形式的纠正和帮助。
干杯

相关问题