无法访问 KeyEventArgs 的 SuppressKeyPress 属性
SuppressKeyPress Property of KeyEventArgs not accessible
在花了 90 分钟寻找这个简单问题的解决方案后,我不得不 post 羞愧地提出一个问题。
我正在处理用户输入文本的 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)
{
e.???
}
我通过双击设计器中的 KeyDown-属性 字段在后面创建了这段代码(如果我在那里搞砸了,请提及这一点)。
Screenshot of the Property Window
我无法访问 e.SupressKeyPress 属性。为什么?
至于 VS 提供的属性,我认为 e 是错误的类型或在错误的上下文中。
Intellisense Screenshot
编辑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,我才能够构建出这样的作品。
但我认为它过于复杂。所以仍然欢迎改进:)
新错误创建消息框时应用程序挂起,没有抛出异常。
您正在使用 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" />
在花了 90 分钟寻找这个简单问题的解决方案后,我不得不 post 羞愧地提出一个问题。
我正在处理用户输入文本的 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)
{
e.???
}
我通过双击设计器中的 KeyDown-属性 字段在后面创建了这段代码(如果我在那里搞砸了,请提及这一点)。
Screenshot of the Property Window
我无法访问 e.SupressKeyPress 属性。为什么? 至于 VS 提供的属性,我认为 e 是错误的类型或在错误的上下文中。
Intellisense Screenshot
编辑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,我才能够构建出这样的作品。 但我认为它过于复杂。所以仍然欢迎改进:)
新错误创建消息框时应用程序挂起,没有抛出异常。
您正在使用 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" />