2012-09-12 108 views
0

我在WPF以下層次:按鍵事件隧道

窗口>網格>的ScrollViewer>的StackPanel> [的UserControl1,UserControl2 ...]

現在我想收到的StackPanel按鍵事件一旦窗口焦點。我該如何做到這一點?僅僅將代碼添加到StackPanel中的PreviewKeyUp/Down處理程序似乎不起作用;看起來這些事件不是通過StackPanel從窗口隧道傳輸的。

我應該看看RoutedEventHandlers嗎?

編輯:我注意到的是,如果堆棧面板具有焦點,則會收到關鍵事件。否則,它不會。

回答

0

試試這個;

EventManager.RegisterClassHandler(typeof(System.Windows.Controls.Control), System.Windows.Controls.Control.KeyDownEvent, yourdelegate); 

將其添加到應用程序啓動。

0

確保不處理該事件。

例如,如果您有:

<Grid KeyDown="Grid_KeyDown"> 
    <ScrollViewer Name="scrollViewer1" > 
     <StackPanel Name="stackPanel1" > 
      <TextBox Height="23" Name="textBox1" KeyDown="textBox1_KeyDown" /> 
     </StackPanel> 
    </ScrollViewer> 
</Grid> 

enter image description here

注意,文本框事件先開炮。然後另一個事件發生。

如果我把

​​

方法textBox1_KeyDown內,則事件不會佈雷意義的方法Grid_KeyDown將不會執行。

預覽keword反其道而行之。而不是像這個例子那樣冒出來的事件,我只是表明它會隧道。

嘗試確保事件未被處理。也許用戶控制處理它。

+0

我注意到的是,如果堆棧面板具有焦點,則會收到關鍵事件。否則,它不會。 – States

+0

爲什麼你需要這個功能?你想達到什麼目的?如果您在總是發生火災的情況下執行您想要執行的操作,會發生什麼情況? –

+0

當在窗口中按下某個鍵(如LeftCtrl)時,我想在* all *(聚焦或不聚焦)用戶控件上顯示疊加層。現在,我通過查詢孩子手動將事件從Window傳遞到StackPanel到UserControl。 – States