如何在运行时更改 C# MAUI 应用程序的主主题颜色?

问题描述 投票:0回答:1

我的 MAUI 应用程序分为一个登录页面和两个 shell,适用于每种类型的用户(正常,主题为蓝色,管理,主题为红色),我不仅希望 shell 内的内容以颜色为主题,还有它之外的东西,比如基色。从一开始,

Resources/Styles/Colorx.xaml
Platforms/Android/Resources/Values/colors.xaml
中的很多颜色都设置为蓝色,这很好,因为登录页面和普通用户 shell 都应该是蓝色的。但是,如果有些部分是红色,有些是蓝色,则管理部分看起来很糟糕,因此如果用户具有管理权限,我想将这些颜色更改为红色。假设,
UserIsAdministrative()
正在被触发。我需要做什么来更改资源?

这就是我的 Colors.xaml 和 Android/colors.xaml 的样子(我省略了其他不相关的颜色)

<ResourceDictionary 
    xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
    xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml">

    <!-- Note: For Android please see also 
Platforms\Android\Resources\values\colors.xml -->
    <Color x:Key="AdministrativeColor">#E3004F</Color>
    <Color x:Key="NormalColor">#0076BD</Color>

    <Color x:Key="Primary">#0076BD</Color>
    <Color x:Key="Tertiary">#0076BD</Color>

    <SolidColorBrush x:Key="PrimaryBrush" Color="{DynamicResource Primary}"/>
    <SolidColorBrush x:Key="TertiaryBrush" Color="{DynamicResource Tertiary}"/>

</ResourceDictionary>

Android Part

<resources>
    <color name="colorPrimary">#0076BD</color>
    <color name="colorPrimaryDark">#0076BD</color>
    <color name="colorAccent">#0076BD</color>
</resources>

当触发

UserIsAdministrative()
时,所有颜色应变为
#E3004F
/
AdministrativeColor

希望您明白我的意思,谢谢!

c# android xamarin runtime maui
1个回答
0
投票

这是更改 Android 主题的解决方法。

首先,在

styles.xml
文件夹中创建一个
Platforms/Android/Resources/values
,与 color.xml 位于同一位置。并将 MAUI 源代码中的所有代码粘贴到 styles.xml 中。

现在我们有了新的

styles.xml
。打开它并在顶部添加这些代码,

<!-- Base application theme. -->
<style name="AdminTheme" parent="Theme.MaterialComponents.DayNight">
    <item name="colorPrimary">@color/colorPrimaryAdmin</item>         
    <item name="colorPrimaryDark">@color/colorPrimaryDarkAdmin</item>
    <item name="colorAccent">@color/colorAccentAdmin</item>
    <item name="android:actionMenuTextColor">@color/colorActionMenuTextColor</item>
    <item name="appBarLayoutStyle">@style/ThemeOverlay.AppCompat.Dark.ActionBar</item>
    <item name="bottomNavigationViewStyle">@style/Widget.Design.BottomNavigationView</item>
    <item name="materialButtonStyle">@style/MauiMaterialButton</item>
    <item name="checkboxStyle">@style/MauiCheckBox</item>
    <item name="android:textAllCaps">false</item>
    <item name="alertDialogTheme">@style/MauiAlertDialogTheme</item
</style>

从上面你就可以看出。我们添加一个新的

AdminTheme
。我要做的就是根据不同的情况切换
AdminTheme
Maui.MainTheme

为此,我们可以重写

OnCreate
中的
MainActivity.cs
方法。在此方法中,我使用 Preferences 来存储值。如果当前用户是admin,则将其设置为
AdminTheme

    protected override void OnCreate(Bundle? savedInstanceState)
    {
       
        if(Preferences.Default.Get("IsAdmin",true)
        {
            SetTheme(Resource.Style.AdminTheme);
        }
        base.OnCreate(savedInstanceState);
    }

最后就是触发这个方法。假设我们被识别为admin,那么设置

Preferences.Default.Set("IsAdmin", true);
#if Android
    Platform.CurrentActivity.Recreate();
#endif
© www.soinside.com 2019 - 2024. All rights reserved.