我从Alexgavru在这个问题中找到了一个简单的XAML解决方案。对我来说<Entry Keyboard="Plain" />
有效。
Xamarin.Forms的预期行为是什么?
iOS上的Forms的Entry
是通过本地UITextField
实现的,自动大写是通过iOS的键盘处理的,对于英语区域设置的默认iOS键盘的默认行为是将单词首字母大写。
您可以通过UITextField.AutocapitalizationType
属性来覆盖此行为。
自动大写样式应用于键入的文本。此属性确定何时自动按下Shift键。您可以使用文本字段的autocapitalizationType属性以编程方式访问此属性的值。
someTextField.AutocapitalizationType = UITextAutocapitalizationType.None;
有什么解决办法吗?
您可以定义表单的行为来处理该更改:
或者一个自定义的 Entry
iOs 渲染器:
public enum UITextAutocapitalizationType : long
{
None,
Words,
Sentences,
AllCharacters
}
我有类似的需求,只是我希望键盘显示所有大写字母以输入代码值。所以我使用了 Xamarin 提供的 Effects 来实现这一点。 这里是将其大写的代码。但是不用费力气,你可以将它改成小写。
Forms:
namespace VINEntryApp.CustomControls
{
public class CapitalizeKeyboardEffect : RoutingEffect
{
public CapitalizeKeyboardEffect() : base("Company.CapitalizeKeyboardEffect")
{
}
}
}
机器人:
[assembly: ResolutionGroupName("Company")]
[assembly: ExportEffect(typeof(CapitalizeKeyboardEffect), nameof(CapitalizeKeyboardEffect))]
namespace VINEntryApp.Droid.Custom
{
[Preserve]
public class CapitalizeKeyboardEffect : PlatformEffect
{
private InputTypes _old;
private IInputFilter[] _oldFilters;
protected override void OnAttached()
{
var editText = Control as EditText;
if (editText != null)
{
_old = editText.InputType;
_oldFilters = editText.GetFilters().ToArray();
editText.SetRawInputType(InputTypes.ClassText | InputTypes.TextFlagCapCharacters);
var newFilters = _oldFilters.ToList();
newFilters.Add(new InputFilterAllCaps());
editText.SetFilters(newFilters.ToArray());
}
}
protected override void OnDetached()
{
var editText = Control as EditText;
if (editText != null)
{
editText.SetRawInputType(_old);
editText.SetFilters(_oldFilters);
}
}
}
}
iOS:
[assembly: ResolutionGroupName("Company")]
[assembly: ExportEffect(typeof(CapitalizeKeyboardEffect), nameof(CapitalizeKeyboardEffect))]
namespace VINEntryApp.iOS.Custom
{
[Preserve]
public class CapitalizeKeyboardEffect : PlatformEffect
{
private UITextAutocapitalizationType _old;
protected override void OnAttached()
{
var editText = Control as UITextField;
if (editText != null)
{
_old = editText.AutocapitalizationType;
editText.AutocapitalizationType = UITextAutocapitalizationType.AllCharacters;
}
}
protected override void OnDetached()
{
var editText = Control as UITextField;
if (editText != null)
editText.AutocapitalizationType = _old;
}
}
}
使用:
<Entry>
<Entry.Effects>
<custom:CapitalizeKeyboardEffect />
</Entry.Effects>
<Entry>
最终,通过以下编程方式设置Entry
的 Keyboard
属性非常有效,而无需使用特定于平台的代码:
UsernameEntry.Keyboard = Keyboard.Create(KeyboardFlags.None);
在 Xamarin.Forms 的源代码中 Extensions.cs
,会检查 Xamarin 键盘类型以确定平台特定键盘的行为。以下是一个示例:
if (keyboard == Keyboard.Default)
{
textInput.AutocapitalizationType = UITextAutocapitalizationType.Sentences;