Xamarin.forms 如何在Xamarin窗体的运行时启用OS AppTheme Dark/Light
我下面是对xamarin表单应用程序中的操作系统主题的回应。该应用程序支持带有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活动,这是在依赖项的帮助下完成的 [
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;
}