我正在使用 Microsoft 的 MAUI 框架创建移动应用程序。为了打开和关闭特定功能,我在我正在处理的 NavigationPage 的 TitleView 中放置了一个 Switch 元素。
因为我使用带有深色操作栏的 Android 主题,所以 Switch 的轨道会淡入该平台的背景中。我通过使用处理程序解决了这个问题,它允许我在 Android 上设置 Switch 的 TrackColor。
问题:当我切换开关时,颜色会恢复到原来的颜色。
在 XAML 文件中:
<NavigationPage.TitleView>
<StackLayout Orientation="Horizontal">
<Switch x:Name="mySwitch" IsVisible="True" OnColor="White" HorizontalOptions="End" Toggled="MySwitchToggled">
<VisualStateManager.VisualStateGroups>
<VisualStateGroup x:Name="CommonStates">
<VisualState x:Name="On">
<VisualState.Setters>
<Setter Property="ThumbColor" Value="#0082FC" /> <!--switch handle bright blue when on-->
</VisualState.Setters>
</VisualState>
<VisualState x:Name="Off">
<VisualState.Setters>
<Setter Property="ThumbColor" Value="White" />
</VisualState.Setters>
</VisualState>
</VisualStateGroup>
</VisualStateManager.VisualStateGroups>
</Switch>
</StackLayout>
</NavigationPage.TitleView>
在代码隐藏文件中:
public ItemListPage(int areaId, string areaName)
{
InitializeComponent();
//some unrelated code removed here
ModifySwitchColors(); //fix switch colors on Android
}
private void ModifySwitchColors()
{
#if ANDROID
var bgColor = Microsoft.Maui.Graphics.Colors.Gray;
SwitchHandler.Mapper.AppendToMapping("CustomColors", (handler, view) => DependencyService.Get<INativeCalls>().ModifySwitchTrackColor(handler, view, bgColor));
#endif
}
在平台特定代码接口(interface)的实现中:
public void ModifySwitchTrackColor(ISwitchHandler handler, ISwitch view, Microsoft.Maui.Graphics.Color inColor)
{
inColor.ToRgba(out var rByte, out var gByte, out var bByte, out var aByte);
var color = new Android.Graphics.Color(rByte, gByte, bByte, aByte);
if (Build.VERSION.SdkInt >= BuildVersionCodes.Q)
{
handler.PlatformView.TrackDrawable.SetColorFilter(new Android.Graphics.BlendModeColorFilter(color, Android.Graphics.BlendMode.SrcAtop));
}
else
{
handler.PlatformView.TrackDrawable.SetColorFilter(color, Android.Graphics.PorterDuff.Mode.SrcAtop);
}
}
有办法解决这个问题吗?
最佳答案
我终于解决了这个问题,但需要一些挖掘。解决方案是编辑开关的轨道色调列表,而不是添加滤色器:
public void ModifySwitchTrackColor(ISwitchHandler handler)
{
//colors use argb format.
//16842912 is Android.r.attr.state_checked which isn't in the MAUI interfaces for some reason
handler.PlatformView.TrackTintList = new ColorStateList(
new int[][] {
new int[] { 16842912 },
new int[] { } //default
},
new int[] {
Android.Graphics.Color.ParseColor("#FFFFFFFF"), //checked
Android.Graphics.Color.ParseColor("#FFBBBBBB") //unchecked
}
);
}
请注意,我必须直接指定 android.R.attr.state_checked
状态的常量 - MAUI 的文件没有它。我不知道这是为什么。
然后,我没有使用 AppendToMapping 调用此函数,而是在页面加载后直接调用它:
void PostOnAppearing(object sender, EventArgs e) //page Loaded event handler
{
DependencyService.Get<INativeCalls>().ModifySwitchTrackColor(mySwitch.Handler as ISwitchHandler);
}
调用一次后,它会在页面加载的其余部分保持不变。万岁!
关于android - 使用处理程序在 Android MAUI 上设置开关的 TrackColor,切换开关时不会保持设置状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/76568904/