Xamarin.Forms中只允许小写输入

4

我正在构建一款用于iOS和Android的Xamarin.Forms应用程序。该应用程序的第一个Page是一个登录表单,包含如下所示的字段。

App login form

我的意图是,在用户名字段上聚焦时,键盘期望全部为小写字符。

在物理Android设备上,通过删除Keyboard="Text"实现了此目的。然而,iOS模拟器似乎坚持认为首字母大写是正确的,在模拟器上弹出软键盘时也显示这种行为。

当浏览Google时,我真的很难找到更多信息。有人知道:

  1. Xamarin.Forms在这里的预期行为是什么?
  2. 解决此问题的方法?
5个回答

5

我从Alexgavru在这个问题中找到了一个简单的XAML解决方案。对我来说<Entry Keyboard="Plain" />有效。


1
谢谢,这在Xamarin.Forms 4.6上运行得非常好。 - vhugo

4

Xamarin.Forms的预期行为是什么?

iOS上的Forms的Entry是通过本地UITextField实现的,自动大写是通过iOS的键盘处理的,对于英语区域设置的默认iOS键盘的默认行为是将单词首字母大写。

您可以通过UITextField.AutocapitalizationType属性来覆盖此行为。

自动大写样式应用于键入的文本。此属性确定何时自动按下Shift键。您可以使用文本字段的autocapitalizationType属性以编程方式访问此属性的值。

示例:

someTextField.AutocapitalizationType = UITextAutocapitalizationType.None;

有什么解决办法吗?

您可以定义表单的行为来处理该更改:

或者一个自定义的 Entry iOs 渲染器:

UITextAutocapitalizationType:

public enum UITextAutocapitalizationType : long
{
    None,
    Words,
    Sentences,
    AllCharacters
}

1
抱歉匆忙地将您的答案标记为已接受 - 在这样做之前应该尝试代码。感谢您的快速建议。 - phantomraa

2
你可以使用TextTransform="Lowercase"。
迟做总比不做好。 :)

0

我有类似的需求,只是我希望键盘显示所有大写字母以输入代码值。所以我使用了 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>

抱歉匆忙地将您的答案标记为已接受 - 在这样做之前应该尝试代码。感谢您的快速建议。 - phantomraa

-1

解决方案

最终,通过以下编程方式设置Entry Keyboard 属性非常有效,而无需使用特定于平台的代码:

UsernameEntry.Keyboard = Keyboard.Create(KeyboardFlags.None);

详情

在 Xamarin.Forms 的源代码中 Extensions.cs,会检查 Xamarin 键盘类型以确定平台特定键盘的行为。以下是一个示例:

if (keyboard == Keyboard.Default)
{
    textInput.AutocapitalizationType = UITextAutocapitalizationType.Sentences;

为什么这个建议被踩了?这是实现功能最简单和直接的方法。有人能解释一下为什么这可能是不好的吗? - Xonshiz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接