我正在创建一个名为 的自定义控件SearchBox
,它有一个ControlTemplate
名为 的文本框searchTextBox
。
我有一个处理searchTextBox.TextChanged
事件的句柄,但我想有一个不同的方法来处理空格。
我不能使用PreviewTextInput
事件,因为它不是在空格上触发的。我也尝试过处理PreviewKeyDown
,但它似乎有不可预测的行为,有时它会捕获空白,有时它不会。
如何在空格出现之前捕获空格TextBox
?
感谢您的回答,但以上内容均未对我有用。我最终检查了TextChanged
事件中的拖尾字符
if (Text.EndsWith(" "))
HandleWhitespace();
正如 etaiso 回答的那样,您可以分配 KeyDown 或 PreviewKeyDown 事件。etaiso 的答案是基于 windows 窗体而不是 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;
}
}
在这种情况下,我不希望文本框对空间做任何事情。也许你可以做类似的事情?如果有空格,可能会引发自定义事件。
试一试。PreviewKeyDown
_TextChanged
并非所有键都在TextChanged
. 退格键是主要罪犯。
如果您在任一事件处理程序中修改文本,请务必尽您所能保存并恢复当前选择。如果不这样做,克拉将始终切换到文本框的开头,这对用户来说非常烦人。
为什么两者都有?
粘贴、剪切文本等非按键操作不会触发PreviewKeyDown
。
您可以分配KeyDown
事件并执行以下操作:
private void textBox1_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.Space)
{
// handle whitespace
}
}
如果您不想让空白出现在文本框中,您可以设置e.SuppressKeyPress = true;