【Xamarin.Forms 2.3.4-pre】新しいOnPlatformメカニズム
Xamarin.Forms 2.3.4-preで新しいOnPlatformの仕組みが導入され、従来の物は非推奨となります。
概要
- 動作プラットフォームを文字列で判別するアプローチに変更(従来はenum)
- Xamarin.Formsがサポートしていないプラットフォームへの対応が容易に(Tizenとか)
- XAMLのOnPlatformで複数のプラットフォームに対してまとめて値を設定可能に
- Device.OnPlatform(), Device.OnPlatform<T>() は実質廃止
RuntimePlatform
これまで、実行中のプラットフォームを取得するにはenum TargetPlatform
型のDevice.OS
プロパティを使用して来ました。
これを置き換える形でstring型のDevice.RuntimePlatform
プロパティが新しく定義されます。
(Xamarin.Forms本体に定義されていない独自のプラットフォームを追加しやすくする意図があるみたい、Tizenとか?)
Xamarin.FormsがサポートするプラットフォームはDevice
クラスの定数として定義されます。
public const string iOS = "iOS"; public const string Android = "Android"; public const string WinPhone = "WinPhone"; public const string Windows = "Windows"; public const string macOS = "macOS";
つまり動作プラットフォームの判別は以下のように変わります。
// 従来のコード(obsolete) Deviec.OS == TargetPlatform.Android // これから推奨されるコード Device.RuntimePlatform == Device.Android
Device.OnPlatformの廃止
Device.OnPlatform()、Device.OnPlatform<T>()がobsoleteとなり、代わりにswitch文とRuntimePlatformを組み合わせて使う事が推奨されます。
// 従来のコード(obsolete) Device.OnPlatform( () => { /* iOS */ }, () => { /* Android */ }, () => { /* WinPhone */ }, () => { /* Default */ }); label.Text = Device.OnPlatform<string>("iOS", "Android", "WinPhone"); // これから推奨されるコード switch(Device.RuntimePlatform) { case Device.iOS: /* iOS */ break; case Device.Android: /* Android */ break; case Device.WinPhone: /* WinPhone */ break; case Device.Windows: /* Windows */ break; case Device.macOS: /* macOS */ break; case "SomethingNewPlatform": /* 独自プラットフォームの場合の処理 */ break; default: /* default */ }
Xamarin.Formsがサポートしていないプラットフォームへも対応しやすくなっていますね。
OnPlatform<T>クラスの仕様変更
XAMLでプラットフォームごとの値を設定するのに使われていたOnPlatform<T>
クラスの使い方が変わります。
これまでのOnPlatform<T>のプロパティとして各プラットフォームごとの値を設定していた代わりに、子要素として持たせる形になります。
<!-- 従来のコード(obsolete) --> <OnPlatform x:TypeArguments="x:Double"> <OnPlatform.iOS>20.0</OnPlatform.iOS> <OnPlatform.Android>42.0</OnPlatform.Android> </OnPlatform> <!-- これから推奨されるコード --> <OnPlatform x:TypeArguments="x:Double"> <On Platform="iOS">20.0</On> <!-- 複数プラットフォームを指定可能 --> <On Platform="Android, Windows">42.0</On> </OnPlatform>
子要素となるOn
クラスのOn.Platform
にはカンマ区切りで同時に複数のプラットフォームを指定できます。ここに指定する名前はRuntimePlatformのに使われる文字列と対応します。