如何创建一个只接受数字的输入范围的PasswordBox?

时间:2014-07-03 09:19:58

标签: c# xaml windows-phone-7 windows-phone-8

这似乎是Windows Phone中一个明显的疏忽。 <PasswordBox />控件不允许指定InputScope

我需要将PasswordBox显示为自定义密码输入屏幕的一部分(例如图像和按钮),并显示数字小键盘以仅允许数字输入。

Coding4Fun的PasswordInputPrompt允许数字输入,但它不可自定义,因为我无法围绕它构建自定义布局,它只允许Title&amp; Message值。

我有什么方法可以做到这一点吗?

3 个答案:

答案 0 :(得分:7)

最好只创建自己的用户控件。

xaml看起来像:

<Grid x:Name="LayoutRoot">
    <TextBox x:Name="PasswordTextBox" InputScope="Number" MaxLength="{Binding MaxLength, ElementName=UserControl}" KeyUp="PasswordTextBox_KeyUp"/>
</Grid>

后面的代码可能是这样的:

public partial class NumericPasswordBox : UserControl
{
    #region Password 

    public string Password
    {
        get { return (string)GetValue(PasswordProperty); }
        set { SetValue(PasswordProperty, value); }
    }

    // Using a DependencyProperty as the backing store for Password.  This enables animation, styling, binding, etc...
    public static readonly DependencyProperty PasswordProperty =
        DependencyProperty.Register("Password", typeof(string), typeof(NumericPasswordBox), new PropertyMetadata(null));

    #endregion

    #region MaxLength

    public int MaxLength
    {
        get { return (int)GetValue(MaxLengthProperty); }
        set { SetValue(MaxLengthProperty, value); }
    }

    // Using a DependencyProperty as the backing store for MaxLength.  This enables animation, styling, binding, etc...
    public static readonly DependencyProperty MaxLengthProperty =
        DependencyProperty.Register("MaxLength", typeof(int), typeof(NumericPasswordBox), new PropertyMetadata(100));

    #endregion

    public NumericPasswordBox()
    {
        InitializeComponent();
    }

    private void PasswordTextBox_KeyUp(object sender, System.Windows.Input.KeyEventArgs e)
    {
        Password = PasswordTextBox.Text;

        //replace text by *
        PasswordTextBox.Text = Regex.Replace(Password, @".", "●");

        //take cursor to end of string
        PasswordTextBox.SelectionStart = PasswordTextBox.Text.Length;
    }
}

您可以根据需要自定义您想要的所有内容,使用示例中显示的MaxLength等依赖项属性。

答案 1 :(得分:0)

可悲的是,PasswordBox控件不会从TextBox控件继承,所以它不支持InputScope。 我认为最好的方法是创建一个新控件。

我同意你的观点,因为Windows Phone已经拥有这种类型的控制(锁屏密码),这有点令人沮丧。

答案 2 :(得分:0)

请随意尝试新的易用的NumericPassword Windows Phone组件。

它基于基本的在线样本,但更好地支持GUI中的值编辑(例如插入符号定位,覆盖选定的部分),以提供更好的用户体验。

可以找到一个快速教程here