在不使用密码框的情况下隐藏文本框控件的文本



我正在使用Windows Phone 8.1 App中的用户输入使用TextBox控件。
当用户提供输入时,如何隐藏字符?

我不使用PasswordBox,因为定义的InputScope"Number",在PasswordBox中是不可能的。

在Internet上搜索解决方案时,我找到了借助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 = "";
    }
}

花了几个小时来找到一种更简单的方法,我得到了一个惊人的解决方案。希望这也会对其他人有所帮助。
我简单地将以下值添加到我的TextBox控制的FontFamily属性:

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

,给出了字体35,

的大小
FontSize="35"

这对我的项目很好。

我设法创建了一个自定义文本框,其中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;
    }
}

相关内容

  • 没有找到相关文章

最新更新