如何在它发生之前捕获文本框上的空格

本文关键字:文本 空格 | 更新日期: 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;
    }
}

在这种情况下,我不希望文本框对空间执行任何操作。也许你可以做类似的事情?如果有空格,可能会引发自定义事件。