在 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 解决方案
- 更改
styles.xml
中的默认主题。
<style name="MainTheme" parent="Theme.AppCompat.DayNight.DarkActionBar">
<item name="windowActionBar">false</item>
<item name="windowNoTitle">true</item>
</style>
- 在表单中定义一个新的
interface
public interface IChangeTheme
{
void EnableDarkTheme(bool _);
}
- 在Android平台上实施
[assembly: Dependency(typeof(Changetheme))]
namespace FormsApp.Droid
{
class Changetheme : IChangeTheme
{
public void EnableDarkTheme(bool _)
{
AppCompatDelegate.DefaultNightMode = _ ? AppCompatDelegate.ModeNightYes : AppCompatDelegate.ModeNightNo;
}
}
}
- 在表单中调用
DependencyService.Get<IChangeTheme>().EnableDarkTheme(true);
参考
iOS 解决方案
与 android 解决方案相同,我还没有测试它,但它应该可以工作,
参考.
我目前正在使用 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 解决方案
- 更改
styles.xml
中的默认主题。
<style name="MainTheme" parent="Theme.AppCompat.DayNight.DarkActionBar">
<item name="windowActionBar">false</item>
<item name="windowNoTitle">true</item>
</style>
- 在表单中定义一个新的
interface
public interface IChangeTheme
{
void EnableDarkTheme(bool _);
}
- 在Android平台上实施
[assembly: Dependency(typeof(Changetheme))]
namespace FormsApp.Droid
{
class Changetheme : IChangeTheme
{
public void EnableDarkTheme(bool _)
{
AppCompatDelegate.DefaultNightMode = _ ? AppCompatDelegate.ModeNightYes : AppCompatDelegate.ModeNightNo;
}
}
}
- 在表单中调用
DependencyService.Get<IChangeTheme>().EnableDarkTheme(true);
参考
iOS 解决方案
与 android 解决方案相同,我还没有测试它,但它应该可以工作,
参考