SuppressKeyPress Свойство KeyEventArgs недоступно
Потратив 90 минут на поиски решения этой простой проблемы, я должен задать вопрос в стыде.
Я работаю над проектом WPF, где пользователь вводит текст. Я хочу проверять вводимые данные, пока пользователь печатает, отображать подсказку и в идеале блокировать недопустимые символы. В основном это эта тема:
Как проверить символы, которые пользователь вводит в текстовое поле WinForms? или это
Есть ли лучший способ проверки ввода пользователя?
private void NameTextbox_KeyDown(object sender, KeyEventArgs e)
{
e.???
}
Я создал этот код, дважды щелкнув в поле KeyDown-Property в конструкторе (просто упомянув об этом, если я все испортил).
Я не могу получить доступ к свойству e.SupressKeyPress. Зачем? Что касается свойств, предлагаемых VS, я думаю, что e имеет неправильный тип или здесь неправильный контекст.
Edit1
private void NameTextbox_KeyDown(object sender, KeyEventArgs e)
{
var strKey = new KeyConverter().ConvertToString(e.Key);
if (!strKey.All(Char.IsLetter))
{
MessageBox.Show("Wrong input");
e.Handled = true;
}
}
Благодаря @rokkerboci я смог создать что-то подобное. Все же я думаю, что это слишком сложно. Так что улучшения еще приветствуются:)
Новая ошибка при создании окна сообщения приложение зависает без сгенерированного исключения.
1 ответ
Вы используете WPF, который не включает специфическое свойство WindowsForms SupressKeyPress.
Вы можете сделать это в WPF, используя событие KeyDown и установив KeyEventArgs.Handled
свойство true (сообщает обработчику, что ему не нужно ничего делать с этим событием).
private void NameTextbox_KeyDown(object sender, KeyEventArgs e)
{
if (e.Key == Key.Delete)
{
MessageBox.Show("delete pressed");
e.Handled = true;
}
}
РЕДАКТИРОВАТЬ:
Я нашел идеальный ответ на ваш вопрос:
C#:
char[] invalid = new char[] { 'a', 'b' };
private void TextBox_PreviewTextInput(object sender, TextCompositionEventArgs e)
{
foreach (var item in invalid)
{
if (e.Text.Contains(item))
{
e.Handled = true;
return;
}
}
}
private void TextBox_Pasting(object sender, DataObjectPastingEventArgs e)
{
var text = e.DataObject.GetData(typeof(string)).ToString();
foreach (var item in invalid)
{
if (text.Contains(item))
{
e.CancelCommand();
return;
}
}
}
XAML:
<TextBox PreviewTextInput="TextBox_PreviewTextInput" DataObject.Pasting="TextBox_Pasting" />