我已经实现了一个类似的实现方法,它允许扩展 Return 按钮以实现任何类型:Go、Next、Done、Send 和 Search。
示例应用
Here is a Xamarin.Forms app 我已经实现了这种方法。随意下载 repo 并尝试一下!
1。创建自定义条目
在 Xamarin.Forms PCL 中,创建自定义条目
public class EntryWithCustomKeyboardReturnButton : Entry
{
public new event EventHandler Completed;
public static readonly BindableProperty ReturnTypeProperty =
BindableProperty.Create<EntryWithCustomKeyboardReturnButton, ReturnType>(s => s.ReturnType, ReturnType.Done);
public ReturnType ReturnType
{
get { return (ReturnType)GetValue(ReturnTypeProperty); }
set { SetValue(ReturnTypeProperty, value); }
}
public void InvokeCompleted()
{
Completed?.Invoke(this, null);
}
}
public enum ReturnType
{
Go,
Next,
Done,
Send,
Search
}
2。创建 iOS 自定义渲染器
在 iOS PCL 中,创建此自定义渲染器
[assembly: ExportRenderer(typeof(EntryWithCustomKeyboardReturnButton), typeof(EntryWithCustomKeyboardReturnButtonCustomRenderer))]
namespace Sample.iOS
{
public class EntryWithCustomKeyboardReturnButtonCustomRenderer : EntryRenderer
{
protected override void OnElementChanged(ElementChangedEventArgs e)
{
base.OnElementChanged(e);
var customEntry = Element as EntryWithCustomKeyboardReturnButton;
if (Control != null && customEntry != null)
{
SetKeyboardButtonType(customEntry.ReturnType);
Control.ShouldReturn += (UITextField tf) =>
{
customEntry?.InvokeCompleted();
return true;
};
}
}
void SetKeyboardButtonType(ReturnType returnType)
{
switch (returnType)
{
case ReturnType.Go:
Control.ReturnKeyType = UIReturnKeyType.Go;
break;
case ReturnType.Next:
Control.ReturnKeyType = UIReturnKeyType.Next;
break;
case ReturnType.Send:
Control.ReturnKeyType = UIReturnKeyType.Send;
break;
case ReturnType.Search:
Control.ReturnKeyType = UIReturnKeyType.Search;
break;
case ReturnType.Done:
Control.ReturnKeyType = UIReturnKeyType.Done;
break;
default:
Control.ReturnKeyType = UIReturnKeyType.Default;
break;
}
}
}
}
3。创建 Android 自定义渲染器
在 Android PCL 中,创建此自定义渲染器
[assembly: ExportRenderer(typeof(EntryWithCustomKeyboardReturnButton), typeof(EntryWithCustomKeyboardReturnButtonCustomRenderer))]
namespace Sample.Droid
{
public class EntryWithCustomKeyboardReturnButtonCustomRenderer : EntryRenderer
{
protected override void OnElementChanged(ElementChangedEventArgs e)
{
base.OnElementChanged(e);
var customEntry = Element as EntryWithCustomKeyboardReturnButton;
if (Control != null && customEntry != null)
{
SetKeyboardButtonType(customEntry.ReturnType);
Control.EditorAction += (object sender, TextView.EditorActionEventArgs args) =>
{
if (customEntry?.ReturnType != ReturnType.Next)
customEntry?.Unfocus();
customEntry?.InvokeCompleted();
};
}
}
void SetKeyboardButtonType(ReturnType returnType)
{
switch (returnType)
{
case ReturnType.Go:
Control.ImeOptions = ImeAction.Go;
Control.SetImeActionLabel("Go", ImeAction.Go);
break;
case ReturnType.Next:
Control.ImeOptions = ImeAction.Next;
Control.SetImeActionLabel("Next", ImeAction.Next);
break;
case ReturnType.Send:
Control.ImeOptions = ImeAction.Send;
Control.SetImeActionLabel("Send", ImeAction.Send);
break;
case ReturnType.Search:
Control.ImeOptions = ImeAction.Search;
Control.SetImeActionLabel("Search", ImeAction.Search);
break;
default:
Control.ImeOptions = ImeAction.Done;
Control.SetImeActionLabel("Done", ImeAction.Done);
break;
}
}
}
}
4。在 Xamarin.Forms PCL 中实现条目的 Completed 事件
这是一个 link to some sample code,它展示了如何在 Xamarin.Forms PCL 中实现 Completed 事件。