我的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);
}
}
}
我不确定如何使用此自定义条目继续为上述操作设置焦点事件。
答案 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
....
}
}
写下这一切内存并在此文本框中,如果某些内容无效,请告诉我,我会花更多时间在它上面!