Xamarin.Formsのダークモード検出にXamarin.EssentialsのAppInfo.RequestedThemeを使うようにした
2020年9月8日
2021年10月15日
更新記事があります Xamarin.Formsのダークテーマ対応でAppThemeBindingを使うようにした |
以前のXamarin.Formsでダークモード対応したで、起動時に一瞬ライトモードが表示されるのと、他のバックグラウンド処理が動かなかったりする問題があったので。
Xamarin.Essentialsにテーマを取得するAPIが追加されたっぽいので使うようにした。
前回作成したDependencyServiceは不要になったので削除。
- Environment_Android.cs
- Environment_iOS.cs
- IEnvironment.cs
Xamarin.Forms
テーマ切替処理を追加
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
public static void ApplyTheme(bool isRedraw = true) { var statusService = App.Current?.Container?.Resolve<IStatusService>(); if (AppInfo.RequestedTheme != AppTheme.Dark) { // change to light theme App.Current.Resources = new LightTheme(); statusService.AppTheme.Value = AppTheme.Light; } else { // change to dark theme App.Current.Resources = new DarkTheme(); statusService.AppTheme.Value = AppTheme.Dark; } if (isRedraw) { var ea = App.Current?.Container?.Resolve<IEventAggregator>(); ea?.GetEvent<BloodListRefreashEvent>().Publish(); } } protected override async void OnStart() { ApplyTheme(false); |
Android
Xamarin.Essentialsの初期化
1 2 3 4 5 |
protected override void OnCreate(Bundle bundle) { base.OnCreate(bundle); Xamarin.Essentials.Platform.Init(this, bundle); |
端末設定を変更時にテーマ更新
1 2 3 4 5 |
public override void OnConfigurationChanged(Configuration newConfig) { base.OnConfigurationChanged(newConfig); App.ApplyTheme(); } |
iOS
Xamarin.Essentialsの初期化は不要
端末設定を変更時にテーマ更新するためにPageRendererを追加
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
public class PageRenderer : Xamarin.Forms.Platform.iOS.PageRenderer { protected override void OnElementChanged(VisualElementChangedEventArgs e) { base.OnElementChanged(e); if (e.OldElement != null || Element == null) { return; } } public override void TraitCollectionDidChange(UITraitCollection previousTraitCollection) { base.TraitCollectionDidChange(previousTraitCollection); App.ApplyTheme(); } } |
とりあえず、起動時のライトモードが表示される現象は解決した。
Xamarin.Forms4.7から、XAMLでかけるっぽい?まだプレビュー?
今後はこれになるのかな。。
そのうち書き換えよう。