gpt4 book ai didi

c# - 在 UWP PasswordBox 中过滤字符的正确方法是什么?

转载 作者:太空宇宙 更新时间:2023-11-03 12:00:41 24 4
gpt4 key购买 nike

我有一个 UWP 应用程序,它使用 PasswordBox 控件进行模糊文本输入。密码的有效字符因实例而异,并且在运行时为 ViewModel 层所知。我希望能够在用户键入无效字符时过滤掉它们。这样做的正确方法是什么?

我们对常规 TextBox 控件有类似的要求。我们已经能够使用 TextChanging 事件和用于重置光标位置的 SelectionStart 属性对文本框执行这种过滤。但是 PasswordBox 没有这些。

密码框的 XAML 如下所示

    <PasswordBox
x:Name="ThePasswordBox"
Grid.Row="1"
MaxLength="{Binding MaxPasswordLength, Mode=OneTime}"
IsEnabled="{Binding IsPasscodeEnabled, Mode=OneWay}"
Password="{Binding Password, FallbackValue=1234, Mode=TwoWay}"
PlaceholderText= "{Binding PlaceholderText, Mode=OneWay}" />

然后我们通过检查输入的有效性来响应 Password.set,如果无效,则重置为之前的值

        set
{
if (_password != value && value != null)
{
// verify that the new password would be valid; if not, roll back
if (!IsPasswordContentAcceptable(value))
{
_passcodeControl.SetPassword(_password);
return;
}

_password = value;

// push the new password to the data binding
_passcodeDataBinding.SetCurrentValue(_password);

// update the UI
HandlePasswordChange();

OnPropertyChanged("Password");
}
}

对 SetCurrentValue() 的调用只是将输入的密码存储到我们的模型层中,不应对本次讨论产生影响。调用 _passwordControl.SetPassword 更新 ThePasswordBox 上的密码字段:

    public void SetPassword(string password)
{
ThePasswordBox.Password = password;
}

HandlePasswordChange() 强制其他 UI 元素重新评估,包括在控件无效时禁用的 OK 按钮。它的实现对这个问题不重要。

这种方法的问题是,当我们重置 PasswordBox 的内容时(调用 SetPassword,它设置 PasswordBox.Password 属性),光标跳到第一个位置。因此,对于数字密码,键入“12a4”将产生“412”。

我们有哪些选择?

最佳答案

What's the proper way to filter characters in a UWP PasswordBox?

从你的代码来看,你不需要调用Password.set中的SetPassword方法,它会让光标回到起始位置。更好的方法是在双向模式下绑定(bind) Password。并检查密码是否可用。如果 Password 包含不允许的字符,则使用 InputInjector 调用 BackSpace

public string PassWord
{

get { return _passWord; }
set
{
if(value != null && IsPasswordContentAcceptable(value))
{
_passWord = value;
OnPropertyChanged();
}
else
{
InputInjector inputInjector = InputInjector.TryCreate();
var info = new InjectedInputKeyboardInfo();
info.VirtualKey = (ushort)(VirtualKey.Back);
inputInjector.InjectKeyboardInput(new[] { info });
}

}
}

Xaml

<PasswordBox
x:Name="ThePassWordBox"
MaxLength="20"
Password="{x:Bind PassWord, Mode=TwoWay}"
PlaceholderText="Input your Password"
/>

关于c# - 在 UWP PasswordBox 中过滤字符的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57169535/

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