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" />
Другие вопросы по тегам