在不使用 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"
这对我的项目来说效果很好。
我在 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"
这对我的项目来说效果很好。