我正试图改变颜色/风格的StatusBar的基础上,设备被设置为光明或黑暗的主题,但没有太多的运气。
以下XAML在应用程序加载后有效,但在启动屏幕上无效:
<ContentPage.Behaviors>
<toolkit:StatusBarBehavior StatusBarColor="#F8F9FB" StatusBarStyle="DarkContent" />
</ContentPage.Behaviors>
启动画面期间状态列的外观:
应用程序加载后状态栏的外观:
正如你所看到的,上面的XAML在闪屏期间似乎并没有影响状态栏,因为它仍然显示默认的紫色和白色文本。你知道如何在应用显示闪屏时更改状态栏吗?
最终目标是根据设置为浅色或深色主题的设备相应地设置状态栏颜色和图标颜色。例如,如果设备设置为使用深色主题,则显示闪屏和应用程序 shell 时的状态栏应为深色背景,并带有浅色文本/图标。当设备设置为使用浅色主题时,显示闪屏和应用程序 shell 时的状态栏应为浅色背景和深色文本/图标。
我已经检查了许多关于这一点的现有问题,但它们似乎都过时了,因为我使用的是API 33。
1条答案
按热度按时间fslejnso1#
一开始,Android上的状态栏颜色是由您在第一个启动屏幕截图中看到的
MainActivity
设置的。StatusBarBehavior
只有在MainActivity中加载托管的MAUI应用后才会生效。更新
在.NET MAUI中,您可以将
MainActivity
类中设置的Maui.SplashTheme
主题替换为您自己的主题,例如MyAppTheme
:您可以创建自己的主题,以设置启动画面的颜色,包括状态栏,您将需要创建一个黑暗和一个光明模式分别。
灯光模式
在MAUI项目中,导航到
Platforms/Android/Resources/
文件夹,如果还没有,则添加values
子文件夹。在此文件夹中,创建两个文件(或编辑现有文件):注意:styles.xml文件可能已经存在,只是被隐藏了。如果是这样,右键点击
values
文件夹,选择 Add -〉Existing Item,然后选择styles.xml
文件。然后,在您的
colors.xml
中定义一些颜色,例如:接下来,在
styles.xml
中创建您自己的主题,从Maui.SplashTheme
继承并为android:windowSplashScreenBackground
项设置颜色:这将设置当用户使用Android的Light主题时的闪屏颜色。
暗模式
对于黑暗的主题,你需要做基本上相同的光主题,有一个小的区别。
在MAUI项目中,添加以下子文件夹:
Platforms/Android/Resources/values-night
(注意 -night 后缀)。在此文件夹中,再次创建两个文件:在
colors.xml
中定义一些颜色,例如:同样,在
styles.xml
中创建您自己的主题,从Maui.SplashTheme
继承并为android:windowSplashScreenBackground
项设置颜色:这将设置当用户使用Android的黑暗主题时的启动画面颜色。
主题结论
由于
Maui.SplashTheme
继承自Theme.MaterialComponents.DayNight
,您可以操作任何类型的属性来显示原生Android视图和窗口,例如状态栏和操作栏。这只需要Platforms/Android/Resources/
下存在values
和values-night
文件夹,每个文件夹包含colors.xml
和styles.xml
文件。您可以在此处找到
Maui.SplashTheme
主题的定义:https://github.com/dotnet/maui/blob/main/src/Core/src/Platform/Android/Resources/values/styles.xml有关Android主题的更多信息:
在运行时操作StatusBarColor
在加载MainActivity并托管MAUI应用程序之后,您仍然可以随时通过调用
Window.SetStatusBarColor()
来操作StatusBarColor,例如如下所示(注意,您可以在任何其他位置执行此操作,并使用控制反转从共享上下文中设置颜色):这就是我在我目前的一个项目中使用它的方式。我想知道如何在Splash屏幕期间改变状态栏,然后发现你需要为此改变
Maui.SplashTheme
。响应主题更改
如果需要在运行时根据系统主题更改主题并对更改作出响应,请参阅以下内容:
https://learn.microsoft.com/en-us/dotnet/maui/user-interface/system-theme-changes#react-to-theme-changes
注意:如果您想在运行时从共享代码中显式设置状态栏颜色,您需要使用控制反转或条件编译。您可以使用任何IoC容器来实现此功能,或者观看James Montemagno的YT视频:https://youtu.be/JCgxK0pWjNg
如果您有兴趣让用户自己选择主题,请查看我的博客文章,其中介绍了使用.NET MAUI的Dark和Light主题:
https://ewerspej.hashnode.dev/implement-dark-mode-in-net-maui