You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

无法获取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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 17:02:31