【问题标题】:Xamarin Themes Switch dark and lightXamarin 主题切换黑暗和光明
【发布时间】:2017-04-18 21:06:43
【问题描述】:

我更新到 Xamarin.Forms 和 Xamarin.Forms.Pages V2.3.5.233-pre1 并且我的动态主题更改在当前屏幕上停止工作。以前,当我更改它和任何打开的屏幕时,它会更改我所在的屏幕。现在似乎需要我关闭任何打开的屏幕并重新打开它。我不确定如何刷新屏幕,因为这确实不是一个理想的选择。

这是我更改主题的方法。任何意见将是有益的。如果我回到以前的版本,它可以正常工作,但是我失去了我需要的新功能。

我只是使用给定的深色和浅色主题 我有一个简单的选择器来选择它们。

    <StackLayout Orientation="Horizontal" >
    <Label Text="Theme"  HorizontalOptions="Start" VerticalOptions="Center" />
    <Picker SelectedIndex="{Binding Theme,Mode=TwoWay}" HorizontalOptions="EndAndExpand" VerticalOptions="Center">
        <Picker.Items>
            <x:String>Light</x:String>
            <x:String>Dark</x:String>
        </Picker.Items>
    </Picker>
    </StackLayout>

我通过将选择器绑定到下面的主题来更改它:

      public int Theme
        {
            get { return _theme; }
            set
            {
                _theme = value;
                App.SetTheme = (MySettings.Theme)value;
            }
        }

在应用程序中:

            public static MySettings.Theme SetTheme {
            set
            {
                if (value == MySettings.Theme.Light)
                {
                    App.Current.Resources = new ResourceDictionaryLight();
                }
                else if (value == MySettings.Theme.Dark)
                {
                    App.Current.Resources = new ResourceDictionaryDark();
                }
            }
        }

ResourceDictionaryLight xaml 像这样:

    <?xml version="1.0" encoding="utf-8"?>
    <ResourceDictionary xmlns="http://xamarin.com/schemas/2014/forms" 
                 xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" 
                 x:Class="ChurchApp.ResourceDictionaryLight" 
                 MergedWith="light:LightThemeResources"
                 xmlns:light="clr-namespace:Xamarin.Forms.Themes;assembly=Xamarin.Forms.Theme.Light">
    </ResourceDictionary>

感觉像一个错误(无论是旧的还是新的),因为它改变了它的工作方式,而我没有更改任何代码。

【问题讨论】:

    标签: xaml xamarin xamarin.forms themes resourcedictionary


    【解决方案1】:

    从 Xamarin.Forms 4.7 开始,引入了 AppThemeBinding,这使得主题管理非常容易,因为它内置在框架内。

    这是一个示例,说明如何在 Light 和 Dark 主题中定义属性:

    <Label Text="Hellow World" TextColor="{AppThemeBinding Dark=White, Light=Black}"/>
    

    这不是主要目标,但请注意,您不仅可以定义颜色,还可以定义为 Light 和 Dark 主题设置的任何属性的值。 这可能不是一个实际示例,仅用于演示:

    <Label Text="Hellow World" FontSize={AppThemeBinding Dark=12, Light=15} TextColor="{AppThemeBinding Dark=White, Light=Black}"/>
    

    更重要的是,您可以通过设置属性App.Current.UserAppTheme 来选择和更改主题(在您的应用程序中的任何位置,无需重新启动或关闭任何页面) 到:

    • 黑暗:OSAppTheme.Dark
    • 光:OSAppTheme.Light
    • 未指定:OSAppTheme.Unspecified。如果 Android 版本支持深色主题 (Android 10 (API level 29) and higher),那么当此属性设置为这样时,您的应用将遵循 Android 当前选择的主题。

    有用的文档

    1. Microsoft Blog: App Themes for Xamarin.Forms
    2. https://docs.microsoft.com/en-us/xamarin/xamarin-forms/user-interface/theming/system-theme-changes
    3. https://docs.microsoft.com/en-us/xamarin/xamarin-forms/xaml/markup-extensions/consuming#appthemebinding-markup-extension

    【讨论】:

    • 虽然这是有用的信息并且很有价值,但并不能真正回答为什么它不会在应用程序中动态改变的问题。我仍然发现我必须关闭应用程序并重新打开它才能实现主题。您是否有一个在应用程序运行时会发生变化的项目中工作的示例?资源字典不必在每个项目中指定深色和浅色的颜色,而是为所有控件提供了一个位置,而无需遍历每个控件,但是当您更改它时,对我来说它不会实时更新应用程序。需要关闭和打开。谢谢
    • 只是为了明确不动态变化的主题,你自己实现的主题或者你尝试过内置的AppThemeBinding(只需一行代码切换主题无需重新启动),它不适合你?您使用的是哪个版本的 Xamarin.Forms?
    • 我需要实施您描述的更改。我要说的是我仍然使用 ResourceDictionary 目前的一种用于浅色,一种用于深色,当我更改它们时,应用程序需要重新启动才能实现更改。有一天它工作并立即改变,而下一个它没有,这就是我最初发布这个的原因。如果我实现你所描述的,那不是必需的吗?谢谢。我还没有使用 AppThemeBinding。我目前正在使用 4.6.0.726 xamarin.forms。
    • 一开始需要做一些工作,因为您要从自己的实现迁移到全新的实现,但是一旦定义了主题的基本要求,就很容易管理/自定义,这就是主要优势。
    • 我确实赞成。不过我还没来得及测试。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-09-12
    • 2020-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-19
    相关资源
    最近更新 更多