我正在创建名为SearchBox
的自定义控件,其中ControlTemplate
的文本框名为searchTextBox
。
我有searchTextBox.TextChanged
事件的句柄进行了一些处理,但是我希望有一个处理空格的不同方法。
我无法使用PreviewTextInput
事件,因为它没有在空格上触发。我也尝试过处理PreviewKeyDown
,但它似乎有不可预测的行为,有时它会抓住空白,有时却没有。
如何在TextBox
上发现空格?
答案 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
}
}