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



在Xamarin Forms中,在我的设置页面中,我有一个在亮和暗主题之间切换的开关。

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

在我的CustomPickerRenderer for iOS中,我有这样的代码来告诉选取器切换主题。

[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代码运行得很好,但我如何才能为CustomPickerRenderer for Android

我已经搜索了两天了,我不知道怎么做。

请帮帮我

您可以参考以下代码:

我在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"];
});
}
}
}

我想你正在寻找类似的东西

Application.Current.RequestedThemeChanged += (s, a) =>
{
Config.LoadTheme();
};

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

最新更新