Xamarin.Forms 通用类库中平台差异属性设置方法

静态Device类包含几个属性和方法,这些属性和方法使您的代码可以在运行时以非常简单明了的方式处理设备差异:

1. Device.OS属性返回TargetPlatform枚举的成员:iOS,Android,WinPhone或Other。 WinPhone成员指所有Windows和Windows Phone平台。

2. Device.Idiom属性返回TargetIdiom枚举的成员:Phone,Tablet,Desktop或Unsupported。

您可以在if和else语句或switch and case块中使用这两个属性来执行特定于特定平台的代码。

另外Device类还提供了两个名称为 OnPlatform方法提供了更为优雅的解决方案:

1. 静态泛型方法OnPlatform <T>接受三个类型T的参数(第一个用于iOS,第二个用于Android,第三个用于Windows Phone(包括所有Windows平台)),并返回运行平台的参数。

2. 静态方法OnPlatform有四个Action类型的参数(没有参数并返回void的.NET函数委托),顺序也是iOS、Android和Windows Phone,第四个参数是默认值,并为运行的平台执行该参数。

您可以通过使用Device.OnPlatform<T>泛型方法将Padding限制为仅用于iPhone,而不是在所有三个平台上都设置相同的Padding属性。

1 Thickness Padding = Device.OnPlatform<Thickness>(new Thickness(0, 20, 0, 0), 
2                                                  new Thickness(0), 
3                                                  new Thickness(0));

或者,您可以只有一个Thickness构造函数,并使用Device.OnPlatform作为第二个参数:

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

但是,如果只需要为 iOS 设置 Padding,可以使用 Device.OnPlatform 的版本和 Action 参数。默认情况下,这些参数都是 null,所以你可以设置 iOS 上要执行的操作的第一个参数:

public class GreetingsPage : ContentPage 
{ 
      public GreetingsPage() 
      { 
             Content = new Label 
             {
                      Text = "Greetings, Xamarin.Forms!" 
             }; 
            Device.OnPlatform(() => { 
                                 Padding = new Thickness(0, 20, 0, 0); 
                                 }); 
        } 
}

现在,仅当程序在iOS上运行时才执行设置填充的语句。 当然,仅使用Device.OnPlatform的一个参数,对于需要阅读代码的人来说可能有点晦涩,因此您可能希望在参数之前包含参数名称,以明确表明此语句仅针对 iOS:

1 Device.OnPlatform(iOS: () => { 
2                               Padding = new Thickness(0, 20, 0, 0); 
3                               });

像这样命名参数是C#4.0中引入的功能。

相关推荐