Xamarin.Forms.UWP 数字键盘仅在软键盘上

Posted

技术标签:

【中文标题】Xamarin.Forms.UWP 数字键盘仅在软键盘上【英文标题】:Xamarin.Forms.UWP Numeric Keyboard only on soft keyboard 【发布时间】:2017-07-26 18:40:16 【问题描述】:

我正在使用 Xamarin.Forms,并希望有一个纯数字键盘供我的用户使用 PIN 登录。

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

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

我知道我可以轻松地在文本更改时进行验证以确保仅存在数字,但是有没有一种方法可以在 UWP 平台上的 Xamarin.Forms.Entry 的软键盘中仅显示数字小键盘?

【问题讨论】:

在 UWP 桌面上,甚至不仅是键盘,用户也可以输入非数字值并被接受。 【参考方案1】:

所以我自己想出了这个问题,并想为未来的开发人员发布答案。此用例来自在 UWP 平板电脑上显示软键盘,因为 Xamarin.Forms.Entry 使用了 Windows.UI.Xaml.Controls.TextBox。您可以更改TextBoxInputScope 以更改UWP 中的键盘,如documentation 所示。

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

重要PasswordBox 上的InputScope 属性仅支持PasswordNumericPin values。任何其他值都会被忽略。

哦,快!当我们真的想为 UWP 使用 PasswordBox 时,我们使用的是 TextBox。这可以通过 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,但在UWP 上将使用Windows.UI.Xaml.Controls.PasswordBox。我还转发了 Xamarin.Forms.Entry 上的基本事件以使一切正常,但如果 Xamarin.Forms.Entry.TextChanged 属性上的验证发生更改,您还需要让 OnElementPropertyChanged() 方法更新 PasswordBox .

【讨论】:

以上是关于Xamarin.Forms.UWP 数字键盘仅在软键盘上的主要内容,如果未能解决你的问题,请参考以下文章

Xamarin.Forms UWP UI 测试

Xamarin.Forms:UWP 应用的本地化

Breeze# 用于 Xamarin.Forms(UWP、Droid 和 iOS)?

Xamarin.Forms UWP 中的内存泄漏

Xamarin.Forms UWP - 具有分页支持的打印 Web 视图

Xamarin.Forms UWP 项目中标题栏和选项卡之间令人讨厌的空白