Wpf 隐藏TextBox控件的文本而不使用PasswordBox
我正在Windows Phone 8.1应用程序中使用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保留了真正的字符串。请注意,管理插入符号位置并不容易,因
文本框
控件进行用户输入。用户输入时如何隐藏字符 我没有使用
密码箱
,因为定义的输入范围
是“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"