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 在运行时切换样式主题的主要内容,如果未能解决你的问题,请参考以下文章