如何在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设置不同的边框颜色,可以先在共享项目定义附加属性,再在渲染器中读取属性值动态设置:
- 共享项目中新增附加属性静态类:
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); }
- 修改自定义渲染器的
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); } }
- 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
相关产品推荐
相关产品推荐

