Возможно ли указать Xamarin Forms Entry Numeric Keyboard без разделителя запятой или десятичной точкой?

Мне нужно создать форму, в которой пользователь должен ввести свой возраст. Я хотел бы использовать цифровую клавиатуру:

    <Entry
        x:Name="AgeEntry"
        VerticalOptions="FillAndExpand"
        HorizontalOptions="FillAndExpand"
        Keyboard="Numeric"
    />

но он показывает даже символ десятичной точки, я хотел бы показывать только числа...

Ответ 1

Чтобы ограничить Entry только принятием номеров, вы можете использовать Поведение или Триггер.

Оба из них будут реагировать на пользователя, вводящего в них. Таким образом, для вашего использования вы можете заставить триггер или поведение искать любые символы, которые не являются числами, и удалять их.

Примерно так для поведения (обратите внимание, что я написал все это на SO и не пытался скомпилировать его, дайте мне знать, если оно не работает):

using System.Linq;
using Xamarin.Forms;

namespace MyApp {

    public class NumericValidationBehavior : Behavior<Entry> {

        protected override void OnAttachedTo(Entry entry) {
            entry.TextChanged += OnEntryTextChanged;
            base.OnAttachedTo(entry);
        }

        protected override void OnDetachingFrom(Entry entry) {
            entry.TextChanged -= OnEntryTextChanged;
            base.OnDetachingFrom(entry);
        }

        private static void OnEntryTextChanged(object sender, TextChangedEventArgs args) 
        {

            if(!string.IsNullOrWhiteSpace(args.NewTextValue)) 
            { 
                 bool isValid = args.NewTextValue.ToCharArray().All(x=>char.IsDigit(x)); //Make sure all characters are numbers

                ((Entry)sender).Text = isValid ? args.NewTextValue : args.NewTextValue.Remove(args.NewTextValue.Length - 1);
            }
        }


    }
}

Тогда в вашем XAML:

<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
         xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
         xmlns:local="clr-namespace:MyApp;assembly=MyApp"> <!-- Add the local namespace so it can be used below, change MyApp to your actual namespace -->

  <Entry x:Name="AgeEntry"
         VerticalOptions="FillAndExpand"
         HorizontalOptions="FillAndExpand"
         Keyboard="Numeric">
    <Entry.Behaviors>
      <local:NumericValidationBehavior />
    </Entry.Behaviors>
  </Entry>

</ContentPage>

Ответ 2

Я тоже сталкивался с этим, но лучший способ реализовать это через поведение, вот статья, которая подробно показывает вам, как реализовать это, и даже больше, например, ограничение значения числа, введенного данным значением, которое вы установили в своем XAML.

Ответ 3

if (!string.IsNullOrWhiteSpace(args.NewTextValue))
{
    bool isValid = args.NewTextValue.ToCharArray().All(char.IsDigit);

    ((Editor)sender).Text = isValid ? args.NewTextValue : args.OldTextValue;
}

Это предотвращает добавление любого нецифрового символа в редактор независимо от того, где вы его добавили. Так что, если ваш курсор был посередине вашего номера, и вы получили, например, 21h3 в ответе @hvaughan3, вы просто удалили бы последний символ, который дал бы вам 21h с отсутствующей цифрой.

Мой ответ будет использовать только то значение, которое вы имели до добавления нецифрового символа (213).

Но имейте в виду! Если вы поместите это в поведение и отреагируете на событие editor.TextChanged, это все равно изменит текст на короткую секунду на недопустимое значение, так как это событие срабатывает, когда оно уже установлено. это не событие OnTextChanging. То же самое для @hvaughan3 ответа. Чтобы предотвратить любые проблемы, которые могут возникнуть из-за этого, например, потому что вы также слушаете OnTextChanged в Code позади, просто добавьте эту строку перед работой с новым текстовым значением

if (!editor.Text.All(char.IsDigit)) return;