Ввод только строчных букв в Xamarin.Forms - PullRequest
0 голосов
/ 04 мая 2018

Я создаю приложение Xamarin.Forms для использования с iOS и Android. Первым Page этого приложения является форма для входа, поля которой изображены ниже.

App login form

Я намерен заставить клавиатуру (когда она сфокусирована на поле имени пользователя) ожидать строчные буквы.

Я добился этого на физическом устройстве Android, удалив Keyboard="Text". Тем не менее, эмулятор iOS кажется непреклонным, что верхний регистр - это путь к первой букве, также показывающий это поведение, когда на эмуляторе установлена ​​программная клавиатура.

Я действительно изо всех сил пытался найти дополнительную информацию для этого при просмотре Google. Кто-нибудь знает:

  1. Ожидаемое поведение Xamarin. Формы здесь?
  2. Как обойти это?

Ответы [ 3 ]

0 голосов
/ 04 мая 2018

У меня было аналогичное требование, за исключением того, что я хотел, чтобы клавиатура показывала все заглавные буквы для ввода значения кода. Поэтому я использовал эффекты, предоставленные Xamarin, для достижения этой цели. Вот код для его заглавной буквы. Но без каких-либо проблем вы можете изменить его на строчные.

Форма:

namespace VINEntryApp.CustomControls
{
    public class CapitalizeKeyboardEffect : RoutingEffect
    {
        public CapitalizeKeyboardEffect() : base("Company.CapitalizeKeyboardEffect")
        {
        }
    }
}

Droid:

[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>
0 голосов
/ 06 мая 2018

Решение

В конце концов, программная установка свойства Keyboard для Entry, как показано ниже, сработала, не требуя кода для конкретной платформы:

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

Подробнее

В Extensions.cs в исходном коде Xamarin.Forms проверяется тип клавиатуры Xamarin, чтобы определить поведение клавиатур, специфичных для платформы. Пример этого ниже:

if (keyboard == Keyboard.Default)
{
    textInput.AutocapitalizationType = UITextAutocapitalizationType.Sentences;
0 голосов
/ 04 мая 2018

Ожидаемое поведение Xamarin.Forms здесь?

Forms 'Entry на iOS осуществляется через собственный UITextField, а автокапитализация обрабатывается с помощью клавиатуры iOS, и поведение по умолчанию для клавиатуры iOS по умолчанию для английской локали - заглавные слова.

Вы можете переопределить поведение с помощью свойства UITextField.AutocapitalizationType.

Стиль автоматической прописной буквы, применяемый к печатному тексту. Этот атрибут определяет, в какое время автоматически нажимается клавиша Shift. Вы можете получить доступ к значению этого атрибута программно, используя свойство autocapitalizationType текстового поля.

Пример:

someTextField.AutocapitalizationType = UITextAutocapitalizationType.None;

Как обойти это?

Вы можете определить поведение форм для обработки этого изменения:

Или пользовательский Entry iOs рендер:

UITextAutocapitalizationType:

public enum UITextAutocapitalizationType : long
{
    None,
    Words,
    Sentences,
    AllCharacters
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...