更改焦点上Entry的边框颜色

时间:2016-10-18 13:32:06

标签: c# android xamarin xamarin.forms

我的Xamarin.Forms Android应用程序的自定义条目。目前,我使用自定义渲染器为条目提供带边框的椭圆形状。

我还想在焦点上更改Entry Border的颜色,并在非焦点时恢复原始颜色。

我的自定义渲染器如下:

public class EntryCellRenderer : EntryRenderer
{
    protected override void OnElementChanged(ElementChangedEventArgs<Entry> e)
    {
        base.OnElementChanged(e);
        var UIEntry = (e.NewElement != null) ? (EntryCell)e.NewElement : (EntryCell)e.OldElement;

        if (this.Control != null)
        {
            Control.Gravity = Android.Views.GravityFlags.CenterVertical;
            Control.SetPadding(30, 30, 30, 31);
            GradientDrawable gd = new GradientDrawable();
            gd.SetShape(ShapeType.Rectangle);

            var BackgroundColor = ColorHelper.FromHex(CoreTheme.COLOR_DEFAULT_CLEAR);
            var ColorRef = Android.Graphics.Color.Argb(
                (byte)(BackgroundColor.A * 255),
                (byte)(BackgroundColor.R * 255),
                (byte)(BackgroundColor.G * 255),
                (byte)(BackgroundColor.B * 255));


            gd.SetColor((int)ColorRef);

            UIEntry.BackgroundColor = Xamarin.Forms.Color.Transparent;
            gd.SetStroke(7, Android.Graphics.Color.LightGray);
            gd.SetCornerRadius(20.0f);
            Control.SetBackground(gd);

        }
    }
}

我不确定如何使用此自定义条目继续为上述操作设置焦点事件。

2 个答案:

答案 0 :(得分:2)

OnElementChanged中,您可以将事件连接到Focused事件:

e.NewElement.Unfocused += (sender, evt) =>
{
    // unfocused, set color
};
e.NewElement.Focused += (sender, evt) =>
{
    // focus, set color
};

仅供参考:OnNativeFocusChanged可以通过覆盖来完成此操作,但它不公开......

internal virtual void OnNativeFocusChanged(bool hasFocus)
{
}

答案 1 :(得分:0)

您可以在调用Action事件时连接Focus。因此,您需要向自定义Action添加新的EntryCell属性,并将Focus连接起来:

public class CustomEntryCell : EntryCell {

    public Action OnFocusEventAction { get; set; }

    public CustomEntryCell() { Focused += OnFocused }

    private void OnFocused(object sender, FocusEventArgs focusEventArgs) { OnFocusEventAction?.Invoke(); }

    ///Or if you are not at C# 6 yet:
    //private void OnFocused(object sender, FocusEventArgs focusEventArgs) {
    //    Action action = OnFocusEventAction;
    //    if(action != null) { action.Invoke(); }
    //}
}

然后,自定义渲染器会将某些内容分配给控件的Action

public class EntryCellRenderer : EntryRenderer {
    protected override void OnElementChanged(ElementChangedEventArgs<Entry> e) {
        ....
        UIEntry.OnFocusEventAction = () => //Your custom border color change code here
        ....
    }
}

写下这一切内存并在此文本框中,如果某些内容无效,请告诉我,我会花更多时间在它上面!