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

如何在Xamarin.Forms中设置Material Visual Entry的边框颜色

Xamarin.Forms Material Visual Entry 边框颜色设置方案

你已经完成了Material Entry自定义渲染器的基础注册,接下来只需要补充CustomMaterialEntryRenderer类的实现逻辑即可修改边框颜色,以下是两种常用实现方式:


方式1:渲染器内固定全局边框颜色

直接在自定义渲染器中硬编码边框颜色,所有使用Material Visual的Entry都会统一生效:

using Android.Content;
using Android.Content.Res;
using Xamarin.Forms;
using Xamarin.Forms.Material.Android;
using Xamarin.Forms.Platform.Android;

[assembly: ExportRenderer(typeof(Entry), typeof(CustomMaterialEntryRenderer ), new[] { typeof(VisualMarker.MaterialVisual) })]
namespace MyApp.Android
{
    public class CustomMaterialEntryRenderer : MaterialEntryRenderer
    {
        // 必须添加带Context参数的构造函数,否则渲染器会报错
        public CustomMaterialEntryRenderer(Context context) : base(context)
        {
        }

        protected override void OnElementChanged(ElementChangedEventArgs<Entry> e)
        {
            base.OnElementChanged(e);

            if (Control != null)
            {
                // 配置不同状态下的边框颜色
                int[][] states = new int[][]
                {
                    new int[] { Android.Resource.Attribute.StateFocused }, // 聚焦状态
                    new int[] { } // 默认未聚焦状态
                };

                int[] colors = new int[]
                {
                    Color.FromHex("#2196F3").ToAndroid(), // 聚焦时边框颜色,可替换为自定义色值
                    Color.FromHex("#9E9E9E").ToAndroid() // 未聚焦时边框颜色,可替换为自定义色值
                };

                ColorStateList colorStateList = new ColorStateList(states, colors);
                // 给输入框背景设置色调,直接修改边框颜色
                Control.BackgroundTintList = colorStateList;
            }
        }
    }
}

方式2:支持XAML端单独配置每个Entry的边框颜色

如果需要给不同Entry设置不同的边框颜色,可以先在共享项目定义附加属性,再在渲染器中读取属性值动态设置:

  1. 共享项目中新增附加属性静态类:
public static class EntryExtensions
{
    // 未聚焦状态边框颜色附加属性
    public static readonly BindableProperty BorderColorProperty =
        BindableProperty.CreateAttached("BorderColor", typeof(Color), typeof(EntryExtensions), Color.Gray);

    public static Color GetBorderColor(BindableObject view) => (Color)view.GetValue(BorderColorProperty);
    public static void SetBorderColor(BindableObject view, Color value) => view.SetValue(BorderColorProperty, value);

    // 聚焦状态边框颜色附加属性
    public static readonly BindableProperty FocusedBorderColorProperty =
        BindableProperty.CreateAttached("FocusedBorderColor", typeof(Color), typeof(EntryExtensions), Color.Blue);

    public static Color GetFocusedBorderColor(BindableObject view) => (Color)view.GetValue(FocusedBorderColorProperty);
    public static void SetFocusedBorderColor(BindableObject view, Color value) => view.SetValue(FocusedBorderColorProperty, value);
}
  1. 修改自定义渲染器的OnElementChanged方法,读取附加属性值:
protected override void OnElementChanged(ElementChangedEventArgs<Entry> e)
{
    base.OnElementChanged(e);

    if (Control != null && Element != null)
    {
        var defaultColor = EntryExtensions.GetBorderColor(Element);
        var focusedColor = EntryExtensions.GetFocusedBorderColor(Element);

        int[][] states = new int[][]
        {
            new int[] { Android.Resource.Attribute.StateFocused },
            new int[] { }
        };

        int[] colors = new int[]
        {
            focusedColor.ToAndroid(),
            defaultColor.ToAndroid()
        };

        Control.BackgroundTintList = new ColorStateList(states, colors);
    }
}
  1. XAML中使用方式:
<ContentPage ...
             xmlns:local="clr-namespace:你的共享项目命名空间">
    <!-- 单独指定该Entry的边框颜色 -->
    <Entry Visual="Material" 
           local:EntryExtensions.BorderColor="#CCCCCC"
           local:EntryExtensions.FocusedBorderColor="#FF5722"/>
</ContentPage>

注意事项

确保你的项目中Xamarin.Forms和Xamarin.Forms.MaterialNuGet包版本完全一致,避免出现渲染器不生效的问题。

内容的提问来源于stack exchange,提问作者SoftDev

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.15 19:15:04