2013-10-24 48 views
0

我正在創建一個名爲SearchBox的自定義控件,該控件的ControlTemplate的文本框名爲searchTextBox如何在TextBox上捕獲空白空間,因爲它發生之前

我有一個searchTextBox.TextChanged事件處理,它做了一些處理,但我想有一個不同的方法來處理空白。

我不能使用PreviewTextInput事件,因爲它不會在空白處被觸發。我也嘗試過處理PreviewKeyDown,但它似乎有不可預知的行爲,有時它會捕獲空白,有時它不會。

如何在TextBox之前發現空白?

+0

你也應該處理你爲什麼想要一個不同的方法來處理空白複製和粘貼 – blindmeis

+0

檢查尾礦人物?你想用空白做什麼? –

+0

@Björn'SearchBox'顯示一個建議框。在空白處應該應用該建議並執行一些其他邏輯。它也不應該顯示'TextBox'本身的空間.. –

回答

1

感謝您的回答,但以上都非實際爲我工作。 我結束了在TextChanged事件

if (Text.EndsWith(" ")) 
    HandleWhitespace(); 
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; 
    } 
} 

在這種情況下,我不希望文本框做什麼空間。也許你可以做類似的事情?如果有空白,可能會引發一個自定義事件。

+0

不,因爲'PreviewKeyDown'在'TextChanged'之前觸發... –

0

嘗試PreviewKeyDown以及TextChanged

並非所有的鍵都在TextChanged中被捕獲。退格是一個主要罪犯。

如果您在兩個事件處理程序中修改了文本,請務必保存並儘可能地恢復當前選擇。如果不這樣做,克拉總是會切換到文本框的開頭,這對用戶來說非常煩人。

爲什麼呢?

非粘貼操作如粘貼和剪切文本不會觸發PreviewKeyDown

+0

我嘗試過'PreviewKeyDown'(我在我的問題中有一個錯字),並且沒有這樣的事件名爲'PreviewTextChanged' –

+0

@Omribitan認爲這是一個大腦放屁。沒有這樣的事件:D我將刪除參考。 – Gusdor

0

您可以分配KeyDown事件,這樣做:

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

如果你不想空白字符出現在文本框中可以設置e.SuppressKeyPress = true;

+0

同樣的問題。 'KeyDown'沒有在空格上被觸發...... –

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