无法访问KeyEventArgs的SuppressKeyPress属性

时间:2017-12-24 10:37:41

标签: c# wpf exception-handling errorprovider

在花了90分钟寻找这个简单问题的解决方案后,我不得不羞耻地发布一个问题。

我正在开发一个用户输入文本的WPF项目。我想在用户输入时检查输入,显示工具提示并理想地阻止不允许的字符。基本上就是这个帖子:

How do I validate characters a user types into a WinForms textbox?或此

Is there a best practice way to validate user input?

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

我通过双击设计器中的KeyDown-Property字段来创建此代码(如果我搞砸了那就提到这个)。

Screenshot of the Property Window

我无法访问e.SupressKeyPress属性。为什么? 从VS提供的属性开始,我认为 e 是错误的类型或错误的上下文。

Intellisense Screenshot

EDIT1

{{1}}

感谢@rokkerboci我能够构建一些有用的东西。 但我觉得它太复杂了。所以仍然欢迎改进:)

新错误创建消息框时,应用程序会挂起而不会抛出异常。

1 个答案:

答案 0 :(得分:0)

您正在使用 WPF 包含 WindowsForms 特定的SupressKeyPress属性。

您可以使用KeyDown事件在WPF中执行此操作,并将if (0 < x && x < 42)属性设置为true(它告诉处理程序,它不必对此事件执行任何操作。)

KeyEventArgs.Handled

修改

我找到了你问题的完美答案:

C#:

private void NameTextbox_KeyDown(object sender, KeyEventArgs e)
{
    if (e.Key == Key.Delete)
    {
        MessageBox.Show("delete pressed");
        e.Handled = true;
    }
}

XAML:

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