1

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

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

如何验证用户在 WinForms 文本框中输入的字符?或这个

是否有验证用户输入的最佳实践方法?

private void NameTextbox_KeyDown(object sender, KeyEventArgs e)
    {
        e.???
    }

我通过双击设计器中的 KeyDown-Property 字段在后面创建了这段代码(如果我在那里搞砸了,只需提及这一点)。

属性窗口的屏幕截图

我无法访问 e.SupressKeyPress 属性。为什么?就 VS 提供的属性而言,我认为e是错误的类型或在错误的上下文中。

智能感知屏幕截图

编辑1

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,我能够构建出这样的作品。然而我认为它过于复杂。所以仍然欢迎改进:)

创建消息框时出现新错误,应用程序挂起,但未引发异常。

4

1 回答 1

2

您正在使用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" />
于 2017-12-24T10:41:02.323 回答