【问题标题】:Hiding the text of a TextBox control without using a PasswordBox隐藏 TextBox 控件的文本而不使用 PasswordBox
【发布时间】:2017-02-20 13:54:35
【问题描述】:

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

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

在互联网上搜索解决方案时,我发现唯一的方法是在 UserControl 的帮助下自定义 TextBox

有没有更简单的方法可以在不创建任何UserControl 的情况下做到这一点?
以下是我的代码 sn-p:

在 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 = "";
    }
}

【问题讨论】:

  • 你能捕捉到 PreviewKeyDown 事件并用星号替换字母吗?
  • 我在 TextBox 控件上没有找到 PreviewKeyDown 事件。而是有 KeyDown 事件。我是这个领域的新手。我正在尝试任何可能的解决方案,但仍然没有结果。

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


【解决方案1】:

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

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

并给出了35号字体的大小,

FontSize="35"

这对我的项目很有效。

【讨论】:

  • 不适合我。此外,当您只是更改字体时,您应该担心复制和粘贴以及其他问题,例如字体可用性和其他问题。
  • 对我来说,仅使用字体就可以了。我没有复制和粘贴的问题。我想如果将来出现任何问题,肯定会有办法解决。实际上它是一个自定义创建的字体系列,如果有人想避免实际的漫长过程,它可以用于这种小方面。
  • 这不起作用,因为PassDot 不是默认的 .NET 字体[至少它不在我的系统或我同事的任何系统上]。这也是有问题的,因为 WPF 不会告诉您字体是否未安装在系统上。这意味着如果您在系统上安装字体并将软件交付给客户 X,但他没有该字体,则将使用一些默认的 Windows 字体并且密码将可见。由于System.Windows.Media.FontFamily 的构造函数在找不到字体时也不会抛出异常,因此您无法处理这种情况。
  • 您可以捆绑字体并将其作为资源加载,工作正常。
【解决方案2】:

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

}

【讨论】:

    猜你喜欢
    • 2011-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-12
    • 2016-01-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多