Xamarin.forms 如何在Xamarin窗体的运行时启用OS AppTheme Dark/Light

Xamarin.forms 如何在Xamarin窗体的运行时启用OS AppTheme Dark/Light,xamarin.forms,xamarin.android,xamarin.ios,Xamarin.forms,Xamarin.android,Xamarin.ios,我下面是对xamarin表单应用程序中的操作系统主题的回应。该应用程序支持带有appthemebind的深色和浅色主题。我没有使用任何自定义主题。我只关注操作系统主题。因此,我有一个开关,用户更愿意启用暗模式(与操作系统相同)。该链接建议使用以下代码来启用指定模式(例如暗模式) 上面的代码不起任何作用,但如果我在InitializeComponent()之后在App.cs中写入上述代码,则应用程序将更改为暗模式 然后我意识到要在Android中重新启动main活动,这是在依赖项的帮助下完成的 [

我下面是对xamarin表单应用程序中的操作系统主题的回应。该应用程序支持带有
appthemebind
的深色和浅色主题。我没有使用任何自定义主题。我只关注操作系统主题。因此,我有一个
开关
,用户更愿意启用暗模式(与操作系统相同)。该链接建议使用以下代码来启用指定模式(例如暗模式)

上面的代码不起任何作用,但如果我在
InitializeComponent()
之后在App.cs中写入上述代码,则应用程序将更改为
暗模式

然后我意识到要在Android中重新启动
main活动
,这是在依赖项的帮助下完成的

[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();
if(Device.RuntimePlatform==Device.Android)
DependencyService.Get().OnThemeChanged();

是否有任何方法可以在不重新启动
main活动的情况下更新应用程序主题而不考虑
OS主题(暗/亮)

我想您不必重新启动main活动。根据,我们可以使用
Application.Current.RequestedThemeChanged
事件对主题更改做出反应

请确保按照以下步骤遵循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;
}

我希望这有帮助。

我的错,我想我错了。我问题中的代码按预期工作。我不需要Android服务来重启活动。 从任何地方调用下面的命令都会将主题更改为黑色,而不考虑操作系统主题


Application.Current.UserAppTheme=OSAppTheme.Dark

您是否尝试过在启动时使用
OSAppTheme currentTheme=Application.current.RequestedTheme获取当前主题?好的,这将给我当前应用的主题。如果我在应用程序启动时在App.cs中应用OS主题,应用程序将接受该主题。然而,我想要的是在运行时更改应用程序中的操作系统主题。(例如)操作系统主题为浅,但用户希望启用操作系统暗主题,因此我必须应用Application.Current.UserAppTheme=OSAppTheme.Dark;(除非我重新启动我的应用程序,否则这不会当场改变我的应用程序主题)请更新您的问题,因为您的最后一句话有点混乱-
更新应用程序以遵循操作系统主题。你想要的不是改变“OS”主题,而是有一个独立的应用程序主题,它不跟踪OS主题的配置。为此,我必须明确定义两个主题黑暗/光明,但是,如果你看到AppThemeBinding,这不需要明确定义主题。如果您编写Current.UserAppTheme=OSAppTheme.Dark;在App.cs(应用程序启动)中,无论显式主题设置如何,您的应用程序都将更改为暗模式。请参阅我的bad中的“设置当前用户主题”部分。我只是修改了答案。试试这个。我希望有帮助。如果不尝试上传你正在尝试的内容的演示。应该使用“Application.Current.RequestedTheme”而不是“e.RequestedTheme”,你可以标记这个答案,这将帮助更多有相同问题的人:)。我尝试过这个,但对于Android,该应用程序将不会加载我的可绘制夜间-*图像。这对你有用吗?有什么建议吗?
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;
}