无法获取Xamarin.Forms ListView默认分隔线颜色求助
获取Android平台Xamarin.Forms ListView默认分隔线颜色
在Xamarin.Forms中直接读取ListView.SeparatorColor时,返回的是无效值[Color: A=-1, R=-1, G=-1, B=-1, Hue=-1, Saturation=-1, Luminosity=-1],但实际列表项间的分隔线为灰色。仅针对Android平台,如何获取这个默认分隔线的真实颜色?
相关代码
C#代码
using System; using System.Net.Http; using Xamarin.Forms; namespace APITests { public partial class MainPage : ContentPage { public MainPage() { InitializeComponent(); listView.ItemsSource = new string[] { "A", "B", "C" }; var Color = listView.SeparatorColor; Console.WriteLine(Color); } } }
XAML代码
<?xml version="1.0" encoding="utf-8" ?> <ContentPage xmlns="http://xamarin.com/schemas/2014/forms" xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" x:Class="APITests.MainPage"> <StackLayout> <ListView x:Name="listView"/> </StackLayout> </ContentPage>
解决方案(仅Android平台)
Xamarin.Forms的ListView.SeparatorColor未显式设置时,实际使用的是Android系统主题的默认分隔线颜色,需要通过Android原生API获取:
方法1:自定义ListView渲染器
在Android项目中创建自定义渲染器,直接读取原生ListView的分隔线颜色:
using Android.Content; using Android.Widget; using Xamarin.Forms; using Xamarin.Forms.Platform.Android; [assembly: ExportRenderer(typeof(ListView), typeof(CustomListViewRenderer))] namespace YourAppName.Droid.Renderers { public class CustomListViewRenderer : ListViewRenderer { public CustomListViewRenderer(Context context) : base(context) { } protected override void OnElementChanged(ElementChangedEventArgs<ListView> e) { base.OnElementChanged(e); if (Control != null) { // 获取原生ListView的分隔线颜色 var separatorColor = Control.Divider?.Color; if (separatorColor != null) { // 转换为Xamarin.Forms.Color类型 var xfColor = Color.FromRgba(separatorColor.Value.R, separatorColor.Value.G, separatorColor.Value.B, separatorColor.Value.A); System.Diagnostics.Debug.WriteLine($"分隔线颜色:{xfColor}"); } } } } }
方法2:直接读取系统主题属性
无需渲染器,在Android项目代码中直接读取系统主题的listDivider属性:
using Android.Content.Res; using Xamarin.Forms; // 在Android项目的代码逻辑中调用 var typedValue = new TypedValue(); Context.Theme.ResolveAttribute(Android.Resource.Attribute.ListDivider, typedValue, true); if (typedValue.Type == TypedValue.TypeReference) { var drawable = Context.Resources.GetDrawable(typedValue.ResourceId, Context.Theme); var colorDrawable = drawable as Android.Graphics.Drawables.ColorDrawable; if (colorDrawable != null) { var color = colorDrawable.Color; var xfColor = Color.FromRgba(color.R, color.G, color.B, color.A); System.Diagnostics.Debug.WriteLine($"分隔线颜色:{xfColor}"); } }
说明
当SeparatorColor未手动设置时,其值为Color.Default(即你看到的全-1无效值),实际渲染时会 fallback 到Android系统主题中的listDivider属性颜色。上述两种方法都能获取到真实的分隔线颜色,并转换为Xamarin.Forms可识别的有效Color值。
内容的提问来源于stack exchange,提问作者Berdi
相关产品推荐
相关产品推荐

