Xamarin.Essentials 入門 - #8 アプリのテーマ
はじめに
Xamarin.Essentials のアプリのテーマについて記載します。この API を利用することで、システムから要求されているテーマを取得することができます。
使ってみよう
使い方
Xamarin.Essentials のアプリのテーマの機能は、AppInfo
クラスで提供されています。
AppTheme appTheme = AppInfo.RequestedTheme;
返却される AppTheme
列挙体は以下のいずれかの値になります。
namespace Xamarin.Essentials { public enum AppTheme { Unspecified, // 指定されていない Light, // ライトテーマ Dark // ダークテーマ } }
読んでみよう
AppInfo のコードを読んで、プラットフォーム固有の処理を見ていきます。
iOS
テーマ情報の取得には、UITraitCollection
から UserInterfaceStyle
プロパティの値を取得して、システムから要求されているテーマを判定していることが分かります。以下は、iOS プラットフォームのコードの抜粋です。
static AppTheme PlatformRequestedTheme() { if (!Platform.HasOSVersion(13, 0)) return AppTheme.Unspecified; var uiStyle = Platform.GetCurrentUIViewController()?.TraitCollection?.UserInterfaceStyle ?? UITraitCollection.CurrentTraitCollection.UserInterfaceStyle; return uiStyle switch { UIUserInterfaceStyle.Light => AppTheme.Light, UIUserInterfaceStyle.Dark => AppTheme.Dark, _ => AppTheme.Unspecified }; }
なお、iOS 13 より前のバージョンの環境では、AppTheme.Unspecified
が返されます。
Android
Android.Content.Res.Configuration
クラスの UiMode
プロパティからシステムに要求されているテーマを判定しています。以下は、Android プラットフォームのコードの抜粋です。
static AppTheme PlatformRequestedTheme() { return (Platform.AppContext.Resources.Configuration.UiMode & UiMode.NightMask) switch { UiMode.NightYes => AppTheme.Dark, UiMode.NightNo => AppTheme.Light, _ => AppTheme.Unspecified }; }
UWP
アプリのテーマの取得には、Windows.UI.Xaml.Application
クラスの RequestedTheme
プロパティが利用されていることがわかります。このプロパティの値は、Windows.UI.Xaml.ApplicationTheme
列挙体で Dark
又は、Light
の値を持ちます。
static AppTheme PlatformRequestedTheme() => Application.Current.RequestedTheme == ApplicationTheme.Dark ? AppTheme.Dark : AppTheme.Light;
まとめ
- Xamarin.Essentials のアプリのテーマでは、以下の機能が提供される
- システムから要求されているアプリのテーマに関する情報を取得することができる
- 内部では、以下のネイティブ固有のAPI を利用している
- アプリ情報の取得(ビルド、名前、パッケージ名、バージョン文字列)
- iOS :
UITraitCollection
からUserInterfaceStyle
プロパティを利用している - Android :
Android.Content.Res.Configuration
クラスのUiMode
プロパティを利用している - UWP :
Windows.UI.Xaml.Application
クラスのRequestedTheme
プロパティを利用している
- iOS :
- アプリ情報の取得(ビルド、名前、パッケージ名、バージョン文字列)