2009-09-22 52 views
15

衍生在WPF應用控制空格鍵時,我有已經從文本框衍生這樣的控制:WPF:的onkeydown()沒有被調用用於從WPF文本框

public class SelectableTextBlock : TextBox 
{ 
    protected override void OnKeyDown(KeyEventArgs e) 
    { 
     base.OnKeyDown(e); 
     e.Handled = false; 
    } 
} 

中,onKeyDown方法沒有在向TextBox輸入空格時調用,也不是在按Backspace時觸發,而是爲包括普通可打印字符(例如'a')和修飾鍵(例如)在內的其他輸入觸發。

我將此控件與IsReadOnly設置爲true,因此我可以顯示可選擇的,不可編輯的文本。在WPFToolkit的DataGrid中使用的控件,並且我希望KeyDown事件向上傳播數據網格,即使SelectableTextBlock具有焦點,這就是爲什麼我使用自定義控件將事件明確標記爲未處理的原因。

問題是,事件甚至沒有使我的控制某些鍵。我不能僅僅在DataGrid中使用OnPreviewKeyDown來解決這個問題,因爲我確實希望數據網格中使用的其他控件吞下空間KeyDown事件。

有誰知道我怎麼可以得到空間鍵傳播的KeyDown事件?

謝謝。

回答

12

看來問題是空間(和退格等)鍵按下事件被已經處理的文本框之內,它冒泡到我的派生控制之前。正如Wim發佈的那樣,我假定它是文本撰寫過程的一部分。

爲了解決這個問題,我添加了一個處理程序,即使它已經被處理,它也會接收到按鍵事件,並將其Handled成員設置爲false,以允許它正常進行冒泡。在下面的例子中,它只是爲空格鍵做這個事情,但在我的情況下,我需要做到這一點,我對真的不想在我的SelectedableTextBlock中處理任何關鍵事件,因爲我不知道什麼父母可能會感興趣的關鍵事件。

public class SelectableTextBlock : TextBox 
{ 
    public SelectableTextBlock() : base() 
    { 
     this.AddHandler(SelectableTextBlock.KeyDownEvent, new RoutedEventHandler(HandleHandledKeyDown), true); 
    } 

    public void HandleHandledKeyDown(object sender, RoutedEventArgs e) 
    { 
     KeyEventArgs ke = e as KeyEventArgs; 
     if (ke.Key == Key.Space) 
     { 
      ke.Handled = false; 
     } 
    } 
    ... 
} 

我當然如果任何人有一個更好的解決方案仍然感興趣的......

感謝, E.

2

我曾經在文本框中使用過空格和事件。只有當您添加或刪除空格字符時才觸發事件?

這是我作爲一個答案:(http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/446ec083-04c8-43f2-89dc-1e2521a31f6b

因爲有些輸入法會將空格按鍵爲文本創作過程的一部分,這就是爲什麼它吃了由阿瓦隆通過的TextInput報告正確的複合文本事件。

我可能完全超出了範圍,但閱讀這個線程emmideatly讓我想起我曾經有過的那個問題。

親切的問候,維姆

+0

感謝您的回覆,Wim。 這看起來像一個相關的問題。我發現事件不會觸發空格字符和退格鍵並刪除按鍵。 而在你的情況下,你試圖停止空格鍵被文本框處理,並通過處理預覽,我試圖讓事件冒泡到父級控制,所以這不適用於我。 我有一個解決辦法處理處理關鍵事件並將其設置爲處理。我會在回覆我的原始問題時發佈一般感興趣的代碼。仍然認爲必須有更好的方法。 謝謝,E. – Ergwun 2009-09-23 00:36:37

+0

這應該是這樣寫的:「我有一個解決辦法來處理關鍵事件,並將它們設置爲* unhandled *。 – Ergwun 2009-09-30 00:35:23

2

派生的發言權,RestrictKeysTextBox從文本框。

public class RestrictKeysTextBox : TextBox 
{ 
    .... 
} 

重寫RestrictKeysTextBox中的OnPreviewKeyDown事件。在此覆蓋這樣

認沽邏輯:

if (e.Key == Key.Space) 
{ 
    e.Handled = true; 
} 

綁定RestrictKeysTextBox到你的DataGrid的實例。

這應該不會重寫DataGrid中的OnPreviewKeyDown並消除相關問題。

14

PreviewKeyDown事件正好存在於這類事情中。

private void spacebarHandler_PreviewKeyDown(object sender, KeyEventArgs e) 
{ 
    if (e.Key == Key.Space) 
     e.Handled = true; 
} 

您的KeyDown處理程序永遠不會收到空格鍵的KeyDown事件。

+1

在.NET 4.5中不適用於我。 – Logan 2016-03-02 14:00:41

+2

它在.Net中工作4.6.1 – Dabblernl 2016-05-24 20:24:16