0

我正在创建一个名为 的自定义控件SearchBox,它有一个ControlTemplate名为 的文本框searchTextBox

我有一个处理searchTextBox.TextChanged事件的句柄,但我想有一个不同的方法来处理空格。

我不能使用PreviewTextInput事件,因为它不是在空格上触发的。我也尝试过处理PreviewKeyDown,但它似乎有不可预测的行为,有时它会捕获空白,有时它不会。

如何在空格出现之前捕获空格TextBox

4

5 回答 5

1

感谢您的回答,但以上内容均未对我有用。我最终检查了TextChanged事件中的拖尾字符

if (Text.EndsWith(" "))
    HandleWhitespace();
于 2013-10-24T09:58:41.507 回答
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
    }
}
于 2013-10-24T08:36:10.717 回答
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;
    }
}

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

于 2013-10-24T07:41:45.027 回答
0

试一试。PreviewKeyDown_TextChanged

并非所有键都在TextChanged. 退格键是主要罪犯。

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

为什么两者都有?

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

于 2013-10-24T07:42:19.310 回答
0

您可以分配KeyDown事件并执行以下操作:

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

如果您不想让空白出现在文本框中,您可以设置e.SuppressKeyPress = true;

于 2013-10-24T07:44:50.890 回答