Xamarin.Forms.UWP Цифровая клавиатура только на программной клавиатуре

Я использую Xamarin.Forms и хочу иметь только цифровую клавиатуру, чтобы мои пользователи могли войти с помощью PIN-кода.

Я могу использовать Xamarin.Forms.Entry.Keyboard = Keyboard.Numeric заставить цифровую клавиатуру, и это работает для телефонов iOS, Android и UWP. Однако, когда пользователь запускает такое же приложение на планшете UWP, как Microsoft Surface, он отображает полную клавиатуру, которая включает в себя символы и цифры.

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

Я знаю, что я могу легко выполнить проверку, так как текст изменяется, чтобы обеспечить присутствие только цифр, но есть ли способ отобразить цифровую клавиатуру только на программной клавиатуре для Xamarin.Forms.Entry на платформе UWP?

1 ответ

Решение

Так что я понял это сам и хотел опубликовать ответ для будущих разработчиков. Этот вариант использования связан с отображением программной клавиатуры на планшетах UWP, поскольку Xamarin.Forms.Entry использует Windows.UI.Xaml.Controls.TextBox, Вы можете изменить InputScope из TextBox сменить клавиатуру в UWP как показано в документации.

Конечно, я сделал общую ошибку: не читал документацию целиком, а прыгал прямо к доступным клавиатурам. В начале документа есть важная строка:

Важный InputScope собственность на PasswordBox поддерживает только Password а также NumericPin values, Любое другое значение игнорируется.

О, хватит! Мы используем TextBox когда мы действительно хотим использовать PasswordBox для UWP. Это может быть легко достигнуто с помощью CustomRenderer и пользовательской записи, как показано ниже:

Пользовательский вход:

public class MyCustomPasswordNumericEntry: Xamarin.Forms.Entry
{
}

Пользовательский рендерер:

public class PasswordBoxRenderer : ViewRenderer<Xamarin.Forms.Entry, Windows.UI.Xaml.Controls.PasswordBox>
{
    Windows.UI.Xaml.Controls.PasswordBox passwordBox = new Windows.UI.Xaml.Controls.PasswordBox();
    Entry formsEntry;
    public PasswordBoxRenderer()
    {
        var scope = new InputScope();
        var name = new InputScopeName();

        name.NameValue = InputScopeNameValue.NumericPin;
        scope.Names.Add(name);

        passwordBox.InputScope = scope;
    }

    protected override void OnElementChanged(ElementChangedEventArgs<Entry> e)
    {
        base.OnElementChanged(e);

        if (Control == null)
        {
            SetNativeControl(passwordBox);
        }

        if(e.NewElement != null)
        {
            formsEntry = e.NewElement as Entry;

            passwordBox.PasswordChanged += TextChanged;
            passwordBox.FocusEngaged += PasswordBox_FocusEngaged;
            passwordBox.FocusDisengaged += PasswordBox_FocusDisengaged;
        }

        if(e.OldElement != null)
        {
            passwordBox.PasswordChanged -= TextChanged;
        }
    }

    private void PasswordBox_FocusDisengaged(Windows.UI.Xaml.Controls.Control sender, Windows.UI.Xaml.Controls.FocusDisengagedEventArgs args)
    {
        formsEntry.Unfocus();
    }

    private void PasswordBox_FocusEngaged(Windows.UI.Xaml.Controls.Control sender, Windows.UI.Xaml.Controls.FocusEngagedEventArgs args)
    {
        formsEntry.Focus();
    }

    private void TextChanged(object sender, Windows.UI.Xaml.RoutedEventArgs e)
    {
        formsEntry.Text = passwordBox.Password;
    }
}

И наконец, убедитесь, что мы просто зарегистрировали CustomRenderer:

[assembly: Xamarin.Forms.Platform.UWP.ExportRenderer(typeof(MyCustomPasswordNumericEntry), typeof(PasswordBox.UWP.PasswordBoxRenderer))]

Теперь наш MyCustomPasswordNumericEntry будет использовать Xamarin.Forms.Entry на всех платформах, но будет использовать Windows.UI.Xaml.Controls.PasswordBox на UWP. Я также отправил основные события на Xamarin.Forms.Entry чтобы все работало, но вам также необходимо иметь OnElementPropertyChanged() метод обновления PasswordBox если есть изменения, вытекающие из проверки в свойстве Xamarin.Forms.Entry.TextChanged.

Другие вопросы по тегам