2009-09-22 96 views
0

我有一個PreviewKeyDown處理程序在我的mainwindow上處理向上和向下鍵,所以我可以用我的控件之間的鍵盤導航。全局PreviewKeyDown處理程序vs本地PreviewKeyDown處理程序

現在我有問題了,在一些文本框中我也想使用上/下鍵。這似乎是不可能的,因爲其他處理程序似乎首先吞下了鍵。

是否有可能當這些TextBox控件中的一個被關注時,他們首先獲取上/下鍵,然後吞下它們以便「全局」PreviewKeyDown不會獲取它們?

當然,我可以以某種方式禁用全局處理程序,當這樣一個TextBox得到了重點,但是這種良好的風格?

回答

1

除了在全局密鑰處理程序中過濾掉這些密鑰之外,並沒有真正的選項。

你遇到這個問題的原因是,所有的預覽*事件都是隧道效應,這意味着可視樹中的控件更高,讓它們首先(從根開始)。首先使用這個事件的原因正是導致你的問題。

一個不理想的選擇是爲TextBox.PreviewKeyDown註冊類處理程序(請參閱EventManager.RegisterClassHandler())。雖然這將在您的窗口的PreviewKeyDown處理程序之前調用,但會在您的應用程序中調用所有TextBoxes。這可能或不是你想要的。

+0

但我可以派生自己的TextBox,然後註冊該類的處理程序?或者也許創建一個用戶控件? – codymanix 2009-09-22 10:51:17

+0

我認爲這樣會有效,但我不確定。這絕對值得一試。 – Andy 2009-09-22 18:25:25

+0

抱歉,它不起作用。我使用了EventManager.RegisterClassHandler(typeof(TextBox),TextBox.PreviewKeyDownEvent,new KeyEventHandler(WatchOutHandler))和其他變體,但全局處理程序似乎總是被首先調用。 – codymanix 2009-09-22 19:01:45