Вопрос:
Я использую элемент управления TextBox для ввода пользователя в моем приложении Windows Phone 8.1.
Как скрыть символы, когда пользователь вводит?
Я не использую 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 = «»; } } Лучший ответ:
Потратив часы на поиск более легкого пути, я получил потрясающее решение. Надеюсь, это тоже поможет другим.
Я просто добавил следующее значение в свойство FontFamily моего элемента управления TextBox:
FontFamily=»ms-appx:///Assets/PassDot.ttf#PassDot»
И дал размер шрифта 35,
FontSize=»35″
Это отлично работает для моего проекта.
Ответ №1
Мне удалось создать пользовательский TextBox, в котором Text is *, но есть 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; } }