如何在它发生之前捕获文本框上的空格
本文关键字:文本 空格 | 更新日期: 2023-09-27 18:36:36
我正在创建一个名为 SearchBox
的自定义控件,它有一个带有一个名为 searchTextBox
的文本框的ControlTemplate
。
我有一个用于searchTextBox.TextChanged
事件的句柄,可以执行一些处理,但我想有一个不同的方法来处理空格。
我不能使用PreviewTextInput
事件,因为它不是在空格上触发的。我也尝试处理PreviewKeyDown
但它似乎具有不可预测的行为,有时它会捕获空格,有时不会。
如何在TextBox
上出现空格之前捕获空格?
感谢您的回答,但以上这些实际上都对我有用。我最终检查了TextChanged
事件中的尾随字符
if (Text.EndsWith(" "))
HandleWhitespace();
您可以分配KeyDown
事件并执行以下操作:
private void textBox1_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.Space)
{
// handle whitespace
}
}
如果不希望文本框上显示空格,可以设置e.SuppressKeyPress = true;
尝试PreviewKeyDown
以及TextChanged
。
并非所有密钥都在 TextChanged
中捕获。退格键是主要罪犯。
如果在任一事件处理程序中修改文本,请确保尽最大努力保存和还原当前所选内容。如果不这样做,克拉将始终切换到文本框的开头,这对用户来说非常烦人。
为什么两者兼而有之?
粘贴和剪切文本等非键操作不会触发PreviewKeyDown
。
正如etaiso回答的那样,您可以分配KeyDown或PreviewKeyDown事件。 Etaiso的答案是基于Windows Form而不是WPF。您可以指定 e.Handle = ture 而不是 SuppressKeyPress
private void textBox1_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.Space)
{
e.Hanlded = true; // SuppressKeyPress is for windows form
}
}
是否可以收听事件 PreviewKeyDown 并在那里进行处理?
编辑1:通过使用PreviewKeyDown,我猜您将无法处理粘贴的文本。
编辑 2:在一个项目中,我创建了一个派生文本框,该文本框覆盖了OnPreviewKeyDown:
protected override void OnPreviewKeyDown(System.Windows.Input.KeyEventArgs e)
{
base.OnPreviewKeyDown(e);
if (e.Key == System.Windows.Input.Key.Space)
{
//Prevent spaces (space does not "raise" OnPreviewTextInput)
e.Handled = true;
}
}
在这种情况下,我不希望文本框对空间执行任何操作。也许你可以做类似的事情?如果有空格,可能会引发自定义事件。