tafuji's blog

C#, Xamarin, Azure DevOps を中心に書いています。

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 を利用している

参考