在 Xamarin.Forms 中手动应用深色主题

Manually apply dark theme in Xamarin.Forms

我目前正在使用 Xamarin.Forms 创建一个 Android-app。我正在尝试实现一个设置菜单,用户可以在其中选择 he/she 想要使用的主题(系统 default/light/dark)。系统默认工作正常,深色主题和浅色主题按预期工作。

查看图片: Light theme Dark theme

但是,我遇到的问题是我似乎无法手动将应用程序设置为深色模式。我的意思是我可以改变颜色。背景和文本,但不是 DisplayAlert 或占位符文本的背景颜色。

我尝试使用 Application.Current.UserAppTheme = OSAppTheme.Dark; 但这似乎没有任何作用(我检查它实际上是通过在控制台打印 Application.Current.UserAppTheme 来设置的)。我在这里错过了什么?如何手动设置深色主题,使对话框看起来像上图所示。

如有任何帮助,我们将不胜感激。

芬恩

Application.Current.UserAppTheme 仅适用于 AppThemeBinding 定义的主题,但对话框是内置的,我们无法自定义颜色,因此不会以这种方式工作。

要手动enable/disable黑暗主题,我们必须在每个平台上实现并以Dependency service的形式调用它。

Android 解决方案

  1. 更改 styles.xml 中的默认主题。
 <style name="MainTheme" parent="Theme.AppCompat.DayNight.DarkActionBar">
    <item name="windowActionBar">false</item>
    <item name="windowNoTitle">true</item>  
  </style>
  1. 在表单中定义一个新的 interface
 public interface IChangeTheme
    {
        void EnableDarkTheme(bool _);
    }
  1. 在Android平台上实施
[assembly: Dependency(typeof(Changetheme))]
namespace FormsApp.Droid
{
    class Changetheme : IChangeTheme
    {
        public void EnableDarkTheme(bool _)
        {
            AppCompatDelegate.DefaultNightMode = _ ? AppCompatDelegate.ModeNightYes : AppCompatDelegate.ModeNightNo;
        }
    }
}
  1. 在表单中调用
DependencyService.Get<IChangeTheme>().EnableDarkTheme(true);

参考

iOS 解决方案

与 android 解决方案相同,我还没有测试它,但它应该可以工作, 参考.