OnPlatform 的不同用法 XAML & C#
這篇筆記的專案原始碼,會存放在這裡 OnPlatform 的不同用法 XAML & C# 原始碼
XAML 內的用法
若您想要在 XAML 標記裡面,針對不同平台,宣告不同的屬性值,可以使用
<OnPlatform
項目來宣告。
在底下的範例中,首先針對
<ContentPage.Padding>
屬性定義其上下左右的內縮值,這裡使用了<OnPlatform x:TypeArguments="Thickness">
宣告了這裡的值將會提供 Thinckness
類型的值,並且針對了OnPlatform.iOS
/ OnPlatform.Android
/ OnPlatform.WinPhone
這三個平台,分別定義了 Padding 內容。這個範例是個非常經典的應用,那就是當您在使用 ContentPage
的時候,僅只有在 iOS 平台,您需要往下內縮 20 dp,否則,這個 ContentPage
將會蓋掉最上面的狀態列。這裡的用法使用的屬性項目 (Property Element)方式來表示。
您也可轉換使用屬性 (Attribute) 的方式來宣告不同平台下的值。在底下的
BoxView.Color
範例中,使用了<OnPlatform x:TypeArguments="Color"
來定義這個項目的顏色,不過,這裡使用了屬性方式分別定義了不同平台的顏色值。<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:local="clr-namespace:XFOnPlatform"
x:Class="XFOnPlatform.MainPage">
<ContentPage.Padding>
<OnPlatform x:TypeArguments="Thickness">
<OnPlatform.iOS>
0, 20, 0, 0
</OnPlatform.iOS>
<OnPlatform.Android>
0, 0, 0, 0
</OnPlatform.Android>
<OnPlatform.WinPhone>
0, 0, 0, 0
</OnPlatform.WinPhone>
</OnPlatform>
</ContentPage.Padding>
<StackLayout
Orientation="Vertical">
<BoxView HorizontalOptions="Center">
<BoxView.Color>
<OnPlatform x:TypeArguments="Color"
iOS="Green"
Android="#738182"
WinPhone="Accent" />
</BoxView.Color>
<BoxView.WidthRequest>
<OnPlatform x:TypeArguments="x:Double"
iOS="330"
Android="240"
WinPhone="150" />
</BoxView.WidthRequest>
<BoxView.HeightRequest>300</BoxView.HeightRequest>
</BoxView>
<Label
x:Name="lblMessage"
Margin="0,40,0,0"
HorizontalOptions="Center"
FontSize="30"
TextColor="Red"/>
</StackLayout>
</ContentPage>
C# 內的用法
當您想要在 C# 內,根據不同作業系統,進行不同的商業邏輯處理,您可以使用
Device.OnPlatform
來定義不同平台需要執行的程式碼; 從 Device.OnPlatform
方法定義簽章中,可以看到public static Void OnPlatform (Action iOS, Action Android, Action WinPhone, Action Default)
這表示了,您可以分別針對不同的平台,委派不同的方法並且執行這些程式碼,使用方式相當的簡單,可以參考底下程式碼。
public MainPage()
{
InitializeComponent();
Device.OnPlatform(
Android: () =>
{
lblMessage.Text = "我在 Android 系統下";
},
iOS: () =>
{
lblMessage.Text = "我在 iOS 系統下";
},
WinPhone: () =>
{
lblMessage.Text = "我在 Windows 系統下";
});
}