【问题标题】:How to enable OS AppTheme Dark/Light in Run time in Xamarin Forms如何在 Xamarin Forms 的运行时启用 OS AppTheme Dark/Light
【发布时间】:2020-10-11 09:37:43
【问题描述】:

我正在关注Respond to system theme change 以响应 xamarin 表单应用程序中的操作系统主题。该应用程序支持带有AppThemeBinding 的深色和浅色主题。我没有使用任何自定义主题。我只关注操作系统主题。所以我有一个Switch,用户更愿意启用暗模式(与操作系统相同)。该链接建议使用以下代码来启用指定模式(例如暗模式)。

Application.Current.UserAppTheme = OSAppTheme.Dark;

上面的代码什么都不做,但是如果我把上面的代码写在App.cs中InitializeComponent()之后,app就会变成Dark Mode

然后我意识到在 Dependency 的帮助下重新启动了 Android 中的 MainActivity

[assembly: Dependency(typeof(AndroidThemeChanged))]
    public class AndroidThemeChanged : ITheme
        {
            public void OnThemeChanged()
            {
                var activity = CrossCurrentActivity.Current.Activity;
                var intent = GetLauncherActivity();
                activity.Finish();
                activity.StartActivity(intent);
            }
            public static Intent GetLauncherActivity()
            {
                var packageName = AndroidApp.Context.PackageName;
                return AndroidApp.Context.PackageManager.GetLaunchIntentForPackage(packageName);
            }
        }

然后调用它

if (Device.RuntimePlatform == Device.Android)
   DependencyService.Get<ITheme>().OnThemeChanged();

有没有什么方法可以在不重启MainActivity的情况下更新应用程序主题而不考虑OS theme(暗/亮)?

【问题讨论】:

  • 您是否尝试过使用OSAppTheme currentTheme = Application.Current.RequestedTheme; 在启动时获取当前主题? docs.microsoft.com/en-us/xamarin/xamarin-forms/user-interface/…
  • 嗯,这会给我当前应用的主题。如果我在应用程序启动时在 App.cs 中应用 OS 主题,则应用程序会接受该主题。但是,我想要的是在运行时更改我的应用程序中的操作系统主题。 (例如)操作系统主题是 Light,但用户想要启用 OS Dark 主题,所以我必须应用 Application.Current.UserAppTheme = OSAppTheme.Dark; (除非我重新启动我的应用程序,否则这不会立即更改我的应用程序主题)
  • 请更新您的问题,因为您的最后一句话有点令人困惑 - to update application to follow the OS theme。您想要的不是改变“OS”主题,而是拥有一个独立的应用程序主题,它不跟踪OS主题的配置。

标签: xamarin.forms xamarin.android xamarin.ios


【解决方案1】:

我的错,我想我错了。我问题中的代码按预期工作。我不需要那个 Android 服务来重新启动活动。 无论操作系统主题如何,从任何地方调用下面都会将主题更改为 Dark。

Application.Current.UserAppTheme = OSAppTheme.Dark;

【讨论】:

  • 你可以标记这个答案,这将帮助更多有同样问题的人:)。
  • 我试过了,但对于 Android,该应用程序不会加载我的 drawable-night-* 图像。那对你有用吗?有什么建议吗?
【解决方案2】:

我猜你不必重新启动 MainActivity。根据documentation here,我们可以使用Application.Current.RequestedThemeChanged 事件对主题更改做出反应。

请确保按照 documentation here 遵循 AppThemeBinding 标记扩展。

试试下面的代码。

Application.Current.RequestedThemeChanged += Current_RequestedThemeChanged;

private void Current_RequestedThemeChanged(object sender, AppThemeChangedEventArgs e)
{
    if (e.RequestedTheme == OSAppTheme.Dark)
        Application.Current.UserAppTheme = OSAppTheme.Dark;
    else
        Application.Current.UserAppTheme = OSAppTheme.Light;
}

希望对你有帮助。

【讨论】:

  • 为此,我必须明确定义两个主题 Dark/Light,但是,如果您看到 AppThemeBinding,则不需要明确定义主题。如果你写 Current.UserAppTheme = OSAppTheme.Dark;在 App.cs(应用程序启动)中,您的应用程序将更改为暗模式,而与显式主题无关。请参阅docs.microsoft.com/en-us/xamarin/xamarin-forms/user-interface/…中的“设置当前用户主题”部分
  • 我的错。我刚刚修改了答案。试试这个。我希望它有所帮助。如果不尝试上传您正在尝试的演示。
  • 应该使用 'Application.Current.RequestedTheme' 而不是 'e.RequestedTheme'
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-12-09
  • 2014-06-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多