我尝试为Xamarin Forms创建一个Material Design输入框,但是在提示颜色和底部线方面遇到了问题。
使用York Shen的答案进行编辑:
Xaml页面
使用York Shen的答案进行编辑:
Xaml页面
<customControls:CustomEntry
Keyboard="Email"
Placeholder="EMAIL"
Style="{StaticResource EntryAccount}"
Text="{Binding Email}" />
登录账户风格
<Style x:Key="EntryAccount" TargetType="customControls:CustomEntry">
<Setter Property="PlaceholderColor" Value="{StaticResource BackgroundColor}" />
<Setter Property="BottomLineColor" Value="{StaticResource BackgroundColor}" />
<Setter Property="TextColor" Value="{StaticResource BackgroundColor}" />
<Setter Property="FontSize" Value="{StaticResource Subtitle1}" />
<Setter Property="FontFamily" Value="{StaticResource Subtitle1Font}" />
</Style>
自定义输入框
public class CustomEntry : Entry
{
public static readonly BindableProperty BottomLineColorProperty =
BindableProperty.Create(nameof(BottomLineColor), typeof(Color), typeof(CustomEntry), Color.Blue);
public Color BottomLineColor
{
get => (Color) GetValue(BottomLineColorProperty);
set => SetValue(BottomLineColorProperty, value);
}
}
CustomEntryRenderer
public class CustomEntryRenderer : Xamarin.Forms.Platform.Android.AppCompat.ViewRenderer<CustomEntry, TextInputLayout>
{
public CustomEntryRenderer(Context context) : base(context)
{
}
protected EditText EditText => Control.EditText;
protected override TextInputLayout CreateNativeControl()
{
var textInputLayout = new TextInputLayout(Context);
var editText = new AppCompatEditText(Context);
editText.SetTextSize(ComplexUnitType.Sp, (float) Element.FontSize);
textInputLayout.AddView(editText);
return textInputLayout;
}
protected override void OnElementChanged(ElementChangedEventArgs<CustomEntry> e)
{
base.OnElementChanged(e);
if (e.NewElement != null)
{
var ctrl = CreateNativeControl();
SetNativeControl(ctrl);
var activeColor = Element.BottomLineColor.ToAndroid(global::Android.Resource.Attribute.ColorAccent, Context);
var hintText = Control.Class.GetDeclaredField("mFocusedTextColor");
hintText.Accessible = true;
hintText.Set(Control, new ColorStateList(new int[][] {new[] {0}}, new int[] {activeColor}));
EditText.Enabled = Element.IsEnabled;
Control.Hint = Element.Placeholder;
EditText.SetTextColor(Element.TextColor.ToAndroid());
}
}
}
Element.TextColor和activeColor正确获取我在参数中传递的颜色。但这是我的结果: