こんにちは。エクセルソフトの田淵です。
にあるように、Xamarin.Forms にはプラットフォームやデバイスの種類に準じた処理ができるような Device クラスというのがあります。
Device.OnPlatform
この中でも、iOS で普通に ContentPage
を表示すると一番上の Status bar
に文字が被っちゃうのを避けるために必要な Device.OnPlatform
はよく使うと思います。
- C# の場合
Padding = new Thickness (0, Device.OnPlatform(20,0,0), 0, 0);
- XAML の場合
<ContentPage.Padding> <OnPlatform x:TypeArguments="Thickness" iOS="0, 20, 0, 0" Android="0" WinPhone="0" /> </ContentPage.Padding>
上記の Xamarin のページには
OnPlatform does not currently support differentiating the Windows 8.1, Windows Phone 8.1, and UWP/Windows 10 platforms.
とありますが Xamarin.Forms 2.0 になり、UWP もストアも WinPhone に含む形でサポートされたようです。
UWP
Windows Store
Xamarin.Forms で Windows を含む各種プラットフォーム展開を検討されている方は Xamarin.Forms を最新版にしましょう。
その他の Device クラスも少し紹介
Device.BeginInvokeOnMainThread
重要なやつ。バックグラウンドのスレッドから UI スレッドを触ることは出来ないので、UI スレッドに戻す処理を Device.BeginInvokeOnMainThread
で包みましょう。これは iOS の InvokeOnMainThread
、Android の RunOnUiThread
、 Windows の Dispatcher.BeginInvoke
と同等です。
Device.BeginInvokeOnMainThread ( () => {
// UI を操作する処理
});
Device.OS/Device.Idiom
Device.OS
は
- iOS
- Android
- WinPhone (WP8 Silverlight 版)
- Windows (Windows ストア 8.1 と Windows Phone 8.1 (WinRT 版) と UWP/Windows 10 Mobile を含むデバイス)
を判別します。Xamarin のドキュメントの例そのままですが、以下のように OS によって個別に指定する場合に使用します。
if (Device.OS == TargetPlatform.iOS) { // いつもの iOS の Status bar を避けるやつ。 stackLayout.Padding = new Thickness (0, 20, 0, 0); } Font font; if (Device.OS == TargetPlatform.iOS) { font = Font.OfSize ("MarkerFelt-Thin", Device.GetNamedSize (NamedSize.Medium, typeof(Label))); } else { font = Font.SystemFontOfSize (Device.GetNamedSize (NamedSize.Medium, typeof(Label))); } label.FontFamily = font.FontFamily; label.FontAttributes = font.FontAttributes; label.FontSize = font.FontSize;
Device.Idiom
は
- Phone
- Tablet
- Desktop (UWP のみで取得できる模様)
を判別します。
Label.Text = $"Device type: {Device.OS}.{Device.Idiom}";
で以下が表示されます。
以下のように、スマホ以外でレイアウトを変えたりするのに使えそうです。
if (Device.Idiom == TargetIdiom.Phone) { // 縦用のレイアウト } else { // 横用または大きな画面用のレイアウト }
Device.Styles
以下のビルドインのスタイルが用意されています。
- BodyStyle
- CaptionStyle
- ListItemDetailTextStyle
- ListItemTextStyle
- SubtitleStyle
- TitleStyle
Style = Device.Styles.TitleStyle
や <Label Text="Style" Style="{DynamicResource TitleStyle}"/>
で使用します。
Device.GetNamedSize
Large, Medium などのサイズが用意されています。使いどころが難しいですが Device.OnPlarform
を一緒に使うとよいかも。ただ、Windows ストアだけ異様に文字が小さいのはどうやって回避すべきか分かってませんw
Device.OpenUri
これはそのままで URL を開きます。
Device.OpenUri(new Uri("http://xamarin.com"));
ブラウザで URL を開きます。が、Device.OpenUri
で面白いのは URL なので、tel:090XXXXXXXX
や sms:090XXXXXXX?body=こんにちは+SMS!!
などの Prefix が使えることかもしれません。
Device.StartTimer
タイマー機能もありますよ。と。
まとめ
各種デバイス、OS によって処理を分ける必要があるときに使う Device クラスを紹介しました。詳しくは Xamarin のサンプル を見ていただくのが早いです。
セミナー&勉強会のお知らせ
2016/2/5(金) の午後に初心者向けセミナー、夜に勉強会を開催します。ぜひお越しください♪
Xamarin 気になった方は
是非 ダウンロード(直接) / ダウンロード(弊社経由) して触ってみてください。 学習用リソース や JXUG リンクページ に参考資料を纏めてますので併せてどうぞ。
Xamarin の情報が欲しい方はこのブログも購読いただいたりすると嬉しいです。
以上です。