gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 19:33:04 33 4
gpt4 key购买 nike

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

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

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

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

最佳答案

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

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

Important The InputScope property on PasswordBox supports only the Password and NumericPin values. Any other value is ignored.



哦啪!我们正在使用 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 属性的验证发生更改。

关于uwp - Xamarin.Forms.UWP 数字键盘仅在软键盘上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42633335/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com