Xamarin Forms - 告诉 Android 在运行时切换样式主题

Posted

技术标签:

【中文标题】Xamarin Forms - 告诉 Android 在运行时切换样式主题【英文标题】:Xamarin Forms - Tell Android to switch style theme at runtime 【发布时间】:2021-12-31 04:09:39 【问题描述】:

在 Xamarin Forms 中,在我的设置页面中,我可以在 Light 和 Dark 主题之间切换。

每当我切换主题时,我都会使用MessagingCenter 告诉所有听众主题已经改变。

在我的CustomPickerRenderer for ios 中,我有这段代码可以告诉 Picker 切换主题。

[assembly: ExportRenderer(typeof(Picker), typeof(CustomPickerRenderer))]
namespace CykelStaden.iOS.Renderers

    public class CustomPickerRenderer : PickerRenderer
       
        protected override void OnElementChanged(ElementChangedEventArgs<Picker> e)
        
            base.OnElementChanged(e);

            MessagingCenter.Subscribe<object, string>(this, "ThemeIsDark", (sender, arg) =>
            
                this.OverrideUserInterfaceStyle = UIUserInterfaceStyle.Dark;
            );

            MessagingCenter.Subscribe<object, string>(this, "ThemeIsLight", (sender, arg) =>
            
                this.OverrideUserInterfaceStyle = UIUserInterfaceStyle.Light;
            );
        
    

现在上面的 iOS 代码运行良好,但我怎样才能为 iOS 编写相同的代码? CustomPickerRenderer for android

我已经搜索了 2 天,但我不知道该怎么做。

请帮帮我。

【问题讨论】:

【参考方案1】:

我认为您正在寻找类似的东西

Application.Current.RequestedThemeChanged += (s, a) =>

   Config.LoadTheme();
;

This 存储库包含在 Android 和 Windows 上运行时更改主题的示例应用程序,因此您可以尝试。

【讨论】:

您提供的链接很有帮助,但不是我想要的 我找到了这个((AppCompatActivity)this).Delegate.SetLocalNightMode(AppCompatDelegate.ModeNightYes); - 但我无法从自定义渲染器类中调用它【参考方案2】:

你可以参考下面的代码:

我在 App.xaml 中设置样式。您也可以从文件中添加主题。

 <Application.Resources>
    <ResourceDictionary>
        <Style TargetType="Picker" x:Key="DarkTheme">
            <Setter Property="BackgroundColor" Value="Black"></Setter>
            <Setter Property="TextColor" Value="White"></Setter>
        </Style>
        <Style TargetType="Picker" x:Key="LightTheme">
            <Setter Property="BackgroundColor" Value="White"></Setter>
            <Setter Property="TextColor" Value="Black"></Setter>
        </Style>
    </ResourceDictionary>
</Application.Resources>

Xaml:

  <Picker x:Name="picker" Title="Select a Theme" TitleColor="Green" SelectedIndexChanged="picker_SelectedIndexChanged">
            <Picker.ItemsSource>
                <x:Array Type="x:Type x:String">
                    <x:String>Dark</x:String>
                    <x:String>Light</x:String>
                </x:Array>
            </Picker.ItemsSource>
        </Picker>

后面的代码:

 public Page10()
    
        InitializeComponent();
        picker.Style = (Style)App.Current.Resources["DarkTheme"];
    

    private void picker_SelectedIndexChanged(object sender, EventArgs e)
    

        switch (picker.SelectedItem.ToString())
        
            case "Dark":
                MessagingCenter.Send<Page10>(this, "Dark");
                break;

            case "Light":
                MessagingCenter.Send<Page10>(this, "Light");
                break;
        
    
    protected override void OnDisappearing()
    
        base.OnDisappearing();
        MessagingCenter.Unsubscribe<Page10>(this, "Dark");
        MessagingCenter.Unsubscribe<Page10>(this, "Light");
    

自定义渲染器:

[assembly: ExportRenderer(typeof(Picker), typeof(CustomPickerRenderer))]
namespace App15.Droid

class CustomPickerRenderer : PickerRenderer

    public CustomPickerRenderer(Context context) : base(context)
    

    
    protected override void OnElementChanged(ElementChangedEventArgs<Picker> e)
    
        base.OnElementChanged(e);
        var picker = e.NewElement as Picker;
        MessagingCenter.Subscribe<Page10>(this, "Dark", (sender) =>
        
            picker.Style = (Style)App.Current.Resources["DarkTheme"];
        );
        MessagingCenter.Subscribe<Page10>(this, "Light", (sender) =>
        
            picker.Style = (Style)App.Current.Resources["LightTheme"];
        );
    


【讨论】:

以上是关于Xamarin Forms - 告诉 Android 在运行时切换样式主题的主要内容,如果未能解决你的问题,请参考以下文章

如何调整 xamarin.forms 中的图像大小?

使用 Xamarin.Forms 作为背景

Xamarin.Forms 与 Net.Http [关闭]

如何更改 Xamarin.Forms 中的应用程序图标?

Xamarin Forms 两种方式绑定ActivityIndi​​cator

在 Xamarin Forms 中获取设备音量