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

Hiding the text of a TextBox control without using a PasswordBox

我在 Windows Phone 8.1 应用程序中使用 TextBox 控件来控制用户输入。
如何在用户输入时隐藏字符

我没有使用 PasswordBox,因为定义的 InputScope"Number",这在 PasswordBox.

中是不可能的

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

有没有更简单的方法在不创建任何 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 = "";
    }
}

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

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;
    }

}

在花了几个小时寻找更简单的方法后,我得到了一个了不起的解决方案。希望这对其他人也有帮助。
我只是将以下值添加到 TextBox 控件的 FontFamily 属性 中:

FontFamily="ms-appx:///Assets/PassDot.ttf#PassDot"

并且给了字体35的大小,

FontSize="35"

这对我的项目来说效果很好。