在花了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 是错误的类型或错误的上下文。
{{1}}
感谢@rokkerboci我能够构建一些有用的东西。 但我觉得它太复杂了。所以仍然欢迎改进:)
新错误创建消息框时,应用程序会挂起而不会抛出异常。
答案 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;
}
}
}