Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Wpf 隐藏TextBox控件的文本而不使用PasswordBox_Wpf_Xaml_Textbox_Windows Phone 8.1_Passwordbox - Fatal编程技术网

Wpf 隐藏TextBox控件的文本而不使用PasswordBox

Wpf 隐藏TextBox控件的文本而不使用PasswordBox,wpf,xaml,textbox,windows-phone-8.1,passwordbox,Wpf,Xaml,Textbox,Windows Phone 8.1,Passwordbox,我正在Windows Phone 8.1应用程序中使用文本框控件进行用户输入。 用户输入时如何隐藏字符 我没有使用密码箱,因为定义的输入范围是“Number”,这在密码箱中是不可能的 在互联网上搜索解决方案时,我找到了唯一的方法,那就是在用户控件的帮助下定制文本框 在不创建任何用户控件的情况下,是否有更简单的方法来执行此操作? 以下是我的代码片段: 在XAML页面中: 我设法创建了一个自定义文本框,其中Text是*,但有hiddenText保留了真正的字符串。请注意,管理插入符号位置并不容易,因

我正在Windows Phone 8.1应用程序中使用
文本框
控件进行用户输入。
用户输入时如何隐藏字符

我没有使用
密码箱
,因为定义的
输入范围
“Number”
,这在
密码箱
中是不可能的

在互联网上搜索解决方案时,我找到了唯一的方法,那就是在
用户控件的帮助下定制
文本框

在不创建任何
用户控件的情况下,是否有更简单的方法来执行此操作?
以下是我的代码片段:

在XAML页面中:


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


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

FontFamily="ms-appx:///Assets/PassDot.ttf#PassDot"
并给出了字体35的大小

FontSize="35"

这对我的项目非常有效。

你能捕获PreviewKeyDown事件并用星号替换字母吗?我在文本框控件上找不到PreviewKeyDown事件。相反,存在KeyDown事件。我是这个领域的新手。我正在尝试任何可能的解决方案,但仍然没有结果。不为我工作。此外,当你只是更改字体时,你应该担心复制粘贴和其他事情,例如字体可用性和其他事情。对我来说,只使用字体是可以的。我对复制粘贴没有问题。我想如果将来出现任何问题,肯定会有办法解决的。实际上,它是一个定制创建的字体系列,如果有人想避免实际的长过程,它可以用于这种小方面。这不起作用,因为
PassDot
不是默认的.NET字体[至少它不在我的系统或我同事的任何系统上]。这也是有问题的,因为WPF不会告诉您系统上是否没有安装字体。这意味着,如果您在系统上安装字体并将软件交付给客户X,而客户X没有该字体,则将使用一些默认的Windows字体,并且密码将可见。由于
System.Windows.Media.FontFamily
的构造函数在未找到字体时也不会引发异常,因此您无法处理这种情况。您可以将字体捆绑并作为资源加载,效果良好。
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;
    }

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