2017-02-20 43 views
4

Я использую элемент управления TextBox для ввода пользователем в моем приложении Windows Phone 8.1.
Как скрыть символы, когда пользователь вводит ввод?Скрытие текста элемента управления TextBox без использования пароля PasswordBox

Я не использую PasswordBox, потому что определено InputScope"Number", что невозможно в PasswordBox.

При поиске решения в Интернете я нашел единственный способ, настроив TextBox с помощью UserControl.

Есть ли более простой способ сделать это без создания 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

Я не нашел событие PreviewKeyDown в элементе управления TextBox. Вместо этого есть событие KeyDown. Я новичок в этой области. Я стараюсь любое возможное решение, но все же без результата. –

ответ

0

Потратив несколько часов в поисках более простой способ, я получил удивительное решение. Надеюсь, это тоже поможет другим.
я просто добавил следующее значение к FontFamily свойству моего TextBox управления:

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, который хранит настоящую строку. Обратите внимание, что управление позицией Caret непросто, потому что она изменяется из-за некоторой внутренней логики. Поэтому он всегда находится в конце строки. (Также обратите внимание, что вам может понадобиться, чтобы справиться с некоторыми исключениями и ошибок)

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; 
    } 

}