Xamarin.Forms.UWP 数字键盘仅在软键盘上
Xamarin.Forms.UWP Numeric Keyboard only on soft keyboard
我正在使用 Xamarin.Forms 并希望为我的用户提供一个纯数字键盘以使用 PIN 码登录。
我可以使用 Xamarin.Forms.Entry.Keyboard = Keyboard.Numeric
强制使用数字键盘,这适用于 iOS、Android 和 UWP 手机。但是,当用户在 UWP 平板电脑(如 Microsoft Surface)上运行相同的应用程序时,它会显示完整的键盘,其中包括字符和数字。
我希望数字键盘成为唯一的输入选项,使数据验证更加简单和安全。
我知道我可以轻松地进行验证,因为文本会发生变化以确保只显示数字,但是有没有一种方法可以在 UWP 平台上的 Xamarin.Forms.Entry
软键盘中只显示数字小键盘?
所以我自己想出了这个问题,并希望 post 为未来的开发人员提供答案。此用例来自在 UWP 平板电脑上显示软键盘,因为 Xamarin.Forms.Entry
使用 Windows.UI.Xaml.Controls.TextBox
。您可以更改 TextBox
的 InputScope
以更改 UWP 中的键盘,如 documentation.
所示
当然,我犯了一个常见错误,即没有完整阅读文档,而是直接跳到可用的键盘。在文档中,开头有一行重要内容:
Important The InputScope
property on PasswordBox
supports only the Password
and NumericPin values
. Any other value is ignored.
太棒了!当我们真的想为 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 属性.
我正在使用 Xamarin.Forms 并希望为我的用户提供一个纯数字键盘以使用 PIN 码登录。
我可以使用 Xamarin.Forms.Entry.Keyboard = Keyboard.Numeric
强制使用数字键盘,这适用于 iOS、Android 和 UWP 手机。但是,当用户在 UWP 平板电脑(如 Microsoft Surface)上运行相同的应用程序时,它会显示完整的键盘,其中包括字符和数字。
我希望数字键盘成为唯一的输入选项,使数据验证更加简单和安全。
我知道我可以轻松地进行验证,因为文本会发生变化以确保只显示数字,但是有没有一种方法可以在 UWP 平台上的 Xamarin.Forms.Entry
软键盘中只显示数字小键盘?
所以我自己想出了这个问题,并希望 post 为未来的开发人员提供答案。此用例来自在 UWP 平板电脑上显示软键盘,因为 Xamarin.Forms.Entry
使用 Windows.UI.Xaml.Controls.TextBox
。您可以更改 TextBox
的 InputScope
以更改 UWP 中的键盘,如 documentation.
当然,我犯了一个常见错误,即没有完整阅读文档,而是直接跳到可用的键盘。在文档中,开头有一行重要内容:
Important The
InputScope
property onPasswordBox
supports only thePassword
andNumericPin values
. Any other value is ignored.
太棒了!当我们真的想为 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 属性.