如何在TextBox发生之前捕获空白空间

时间:2013-10-24 07:37:40

标签: c# wpf textbox

我正在创建名为SearchBox的自定义控件,其中ControlTemplate的文本框名为searchTextBox

我有searchTextBox.TextChanged事件的句柄进行了一些处理,但是我希望有一个处理空格的不同方法。

我无法使用PreviewTextInput事件,因为它没有在空格上触发。我也尝试过处理PreviewKeyDown,但它似乎有不可预测的行为,有时它会抓住空白,有时却没有。

如何在TextBox上发现空格?

5 个答案:

答案 0 :(得分:1)

感谢您的回答,但上述内容并非对我有用。 我最终检查了TextChanged事件

中的拖尾字符
if (Text.EndsWith(" "))
    HandleWhitespace();

答案 1 :(得分:0)

是否可以收听事件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;
    }
}

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

答案 2 :(得分:0)

尝试PreviewKeyDown以及TextChanged

并非TextChanged都捕获了所有密钥。 Backspace是一个主要的罪犯。

如果在任一事件处理程序中修改文本,请务必尽可能保存并恢复当前选择。如果不这样做,克拉将始终切换到文本框的开头,这对用户来说非常烦人。

为什么两者兼而有之?

粘贴和剪切文本等非键操作不会触发PreviewKeyDown

答案 3 :(得分:0)

您可以指定KeyDown事件并执行以下操作:

private void textBox1_KeyDown(object sender, KeyEventArgs e)
{
    if (e.KeyCode == Keys.Space)
    {
        // handle whitespace
    }
}

如果您不想在文本框中显示空格,可以设置e.SuppressKeyPress = true;

答案 4 :(得分:0)

正如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
    }
}