2017-02-20 64 views
4

我在Windows Phone 8.1应用程序中使用用户输入的TextBox控件。
如何隐藏用户输入的字符在不使用密码框的情况下隐藏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 = ""; 
    } 
} 
+0

你能捕捉到PreviewKeyDown事件并用星号替换该字母吗? – 0x4f3759df

+0

我在TextBox控件上找不到任何PreviewKeyDown事件。有KeyDown事件。我是这个领域的新人。我正在尝试任何可能的解决方案,但仍然没有结果。 –

回答

0

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

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

并给了35的字体的大小,

FontSize="35" 

这只是正常为我的项目。

+0

不适合我。此外,当你只是改变字体时,你应该担心复制和粘贴以及诸如字体可用性和其他内容等其他内容。 – Ron

+0

对我来说,只要字体就没问题。我没有复制和粘贴的问题..我想如果将来出现任何问题,我肯定会有办法解决。实际上,如果有人想要避免实际的漫长过程,它是一个定制的字体系列,可以用于这种小方面。 –

+0

这不起作用,因为'PassDot'不是默认的.NET字体[至少它不在我的系统或我的同事的任何系统上]。这也是有问题的,因为WPF不会告诉你字体是否安装在系统上。这意味着如果您在系统上安装字体并将软件交付给客户X并且他没有该字体,则将使用一些默认Windows字体并且密码将可见。自'System.Windows.Media。如果FontFamily的构造函数没有找到你无法处理这种情况的字体,它也不会引发异常。 –

0

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

} 
相关问题