Device.OnPlatform已弃用

时间:2017-08-05 20:35:09

标签: c# xamarin

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

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

Visual Studio强调Device.OnPlatform,当我将鼠标指针悬停在方法调用上时,我收到以下警告:

  

Devide.OnPlatform(T,T,T)已过时:'使用   切换(RuntimePlatform)而不是'。

最初使用的代码来自e-book'使用Xamarin.Forms Book创建移动应用程序'发布于2016年。我真的很惊讶这个平台发展得有多快!

不幸的是,我不知道如何使用警告建议的方式替换Device.OnPlatform

5 个答案:

答案 0 :(得分:18)

2016年是这种方法被弃用的一年。

您应该使用switch语句来确定操作系统。

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

你当然可以将这个包装在一个函数中,该函数将执行与你希望用Device.OnPlatform相同的工作,但不是调用Device.OnPlatform,而是调用你自己的函数。

答案 1 :(得分:5)

img src

答案 2 :(得分:1)

如果有人在XAML文件中遇到同样的问题,这可以绕过已弃用的消息:

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

答案 3 :(得分:1)

我通过使用内联三元条件运算符解决了这个问题,这假设您只需要iOS的其他东西

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

答案 4 :(得分:0)

这是一个令人难以置信的 API,我不认为 this forum 中所述的原因可以证明它已被弃用。

它可以很容易地扩展到支持多个平台。我了解 there have 并且在不久的将来会有很多变化,但我认为任何开发人员都不会在每次必须做出简单决定时选择编写繁琐的 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 将永远被人们记住。

我打算用这个制作一个微型 nuget 包,所以我愿意接受任何形式的更正和帮助。

干杯