Xamarin.Forms.UWP仅限软键盘上的数字键盘

时间:2017-03-06 18:52:13

标签: uwp xamarin.forms xamarin.uwp

我正在使用Xamarin.Forms并希望我的用户只能使用数字键盘来使用PIN登录。

我可以使用Xamarin.Forms.Entry.Keyboard = Keyboard.Numeric强制使用数字键盘,这适用于iOS,Android和UWP手机。但是,当用户在UWP平板电脑上运行相同的应用程序(如Microsoft Surface)时,它会显示完整的键盘,其中包括字符和数字。

我希望数字键盘是唯一的输入选项,使数据验证更加简单和安全。

我知道我可以轻松地进行验证,因为文本更改以确保只有数字存在,但有没有办法只在软键盘上显示UWP平台上Xamarin.Forms.Entry的数字键盘?< / p>

1 个答案:

答案 0 :(得分:4)

所以我自己想出了这个,并希望为未来的开发者发布答案。此用例来自UWP平板电脑上显示的软键盘,因为Xamarin.Forms.Entry使用了Windows.UI.Xaml.Controls.TextBox。您可以更改InputScope的{​​{1}}以更改UWP中的键盘,如documentation所示。

当然,我犯了一个常见的错误:不完全阅读文档,而是直接跳到可用的键盘。在文档中,开头有一条重要的界限:

  

重要 TextBox上的InputScope媒体资源仅支持PasswordBoxPassword。忽略任何其他值。

哦,快点!当我们真的想要将NumericPin values用于UWP时,我们会使用TextBox。使用CustomRenderer和自定义条目可以很容易地实现这一点,如下所示:

自定义条目

PasswordBox

自定义渲染器:

public class MyCustomPasswordNumericEntry: Xamarin.Forms.Entry
{
}

最后确保我们只注册CustomRenderer:

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;
    }
}

现在我们的[assembly: Xamarin.Forms.Platform.UWP.ExportRenderer(typeof(MyCustomPasswordNumericEntry), typeof(PasswordBox.UWP.PasswordBoxRenderer))] 将在所有平台上使用MyCustomPasswordNumericEntry,但会在UWP上使用Xamarin.Forms.Entry。我还转发了Windows.UI.Xaml.Controls.PasswordBox上的基本事件以使一切正常,但如果Xamarin上的验证有更改,您还需要让Xamarin.Forms.Entry方法更新OnElementPropertyChanged()。 Forms.Entry.TextChanged属性。