在不使用PasswordBox的情况下隐藏TextBox控件的文本

时间:2017-02-20 13:54:36

标签: wpf xaml textbox windows-phone-8.1 passwordbox

我在Windows Phone 8.1应用中使用TextBox控件作为用户输入 如何在用户提供输入时隐藏字符

我没有使用PasswordBox,因为定义的InputScope"Number",这在PasswordBox中无法实现。

在互联网上搜索解决方案时,我找到了在TextBox的帮助下自定义UserControl的唯一方法。

有没有更简单的方法可以在不创建任何UserControl的情况下执行此操作?
以下是我的代码段:

在XAML页面中:

<TextBox Text="{Binding CardNo, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
    MaxLength="17"
    x:Name="CardNoTextBox"
    InputScope="Number"
    Margin="70,5"
    PlaceholderText="Enter Your Card Number"
    TextChanged="CardNoTextBox_TextChanged"
    BorderBrush="Gray"
    BorderThickness="2"
    FontSize="20"/>

在代码后面(xaml.cs):

private void CardNoTextBox_TextChanged(object sender, RoutedEventArgs routedEventArgs)
{
    if (IsTextAllowed(CardNoTextBox.Text))
    {
        if (CardNoTextBox.Text.Length == 5)
        {
            if (CardNoTextBox.Text[4] != ' ')
            {
                string text = CardNoTextBox.Text.Insert(4, " ");
                CardNoTextBox.Text = text;
                CardNoTextBox.Select(CardNoTextBox.Text.Length, 0);
            }
        }

        if (CardNoTextBox.Text.Length == 12)
        {
            if (CardNoTextBox.Text[11] != ' ')
            {
                string text = CardNoTextBox.Text.Insert(11, " ");
                CardNoTextBox.Text = text;
                CardNoTextBox.Select(CardNoTextBox.Text.Length, 0);
            }
        }
    }
    else
    {
        CardNoTextBox.Text = "";
    }
}

1 个答案:

答案 0 :(得分:0)

我设法创建了一个自定义TextBox,Text是*,但是hiddenText保留了真正的字符串。请注意,管理Caret位置并不容易,因为它会因某些内部逻辑而发生变化。因此,它始终位于字符串的末尾。 (另请注意,您可能需要处理一些异常和错误)

public class HiddenTextBox : TextBox
{ 
    internal string hiddenText { get; private set; }

    protected override void OnPreviewKeyDown(KeyEventArgs e)
    {
        if (e.Key == Key.Space)
            addText(" ");
        else if (e.Key == Key.Back)
            removeText(true);
        else if (e.Key == Key.Delete)
            removeText(false);
        else if (e.Key == Key.Return)
            e.Handled = true;
        base.OnPreviewKeyDown(e);
    }
    protected override void OnPreviewTextInput(TextCompositionEventArgs e)
    {
        addText(e.Text);
        e.Handled = true;
    }
    void addText(string text)
    {
        hiddenText = hiddenText != null ? hiddenText.Insert(CaretIndex, text) : text;
        update();
    }
    void removeText(bool back)
    {
        if (hiddenText == null || hiddenText.Length == 0 || (back==false && CaretIndex == hiddenText.Length))
            return;
        if (back)
            hiddenText = hiddenText.Substring(0, CaretIndex - 1) + hiddenText.Substring(CaretIndex, hiddenText.Length - CaretIndex);
        else
            hiddenText = hiddenText.Substring(0, CaretIndex) + hiddenText.Substring(CaretIndex+1, hiddenText.Length - CaretIndex);
        update();
    }
    void update()
    {
        StringBuilder star = new StringBuilder();
        foreach (var s in hiddenText)
        {
            star.Append("*");
        }
        Text = star.ToString();
    }

    protected override void OnTextChanged(TextChangedEventArgs e)
    {
        if (hiddenText != null)
            CaretIndex += hiddenText.Length;
    }

}