2012-08-28 188 views
2

我有UserControl,它有TreeViewTabControl。這個用戶控件是以正常形式託管的。在UserControl中未觸發KeyDown事件

如果用戶從樹視圖中選擇了一些東西,自定義圖片框將被添加到tabcontrol的tabpage中。現在我想在這個圖片框上處理鍵值,但是我在custompicturebox中創建的事件沒有被調用。我想要的是處理箭頭鍵,但焦點停留在樹形視圖上,所以箭頭鍵只發生在樹形視圖中。

當用戶單擊它時,我提供了代碼將焦點放在圖片框上,但它並不能幫助從樹視圖中移除焦點。這裏是我的custompicturebox控制代碼的一部分:

更新 似乎只有像箭頭鍵特殊鍵不工作,我的猜測是因爲方向鍵正在由樹狀registred。如果我將圖片盒中的KeyDown事件更改爲使用字符鍵,則它可以工作!

private void IcPackageViewBox_KeyDown(object sender, KeyEventArgs e) 
{ 
    if(e.KeyCode == Keys.Right) 
    { 
     OnPinClicked(_pinMap[_pinRectIndex].Pin); 

     if (_pinRectIndex < _pinMap.Count) 
      _pinRectIndex++; 
     else 
      _pinRectIndex = 0; 
    } 
} 
    //Mouse Down Event 
private void PackageViewBox_MouseDown(object sender, MouseEventArgs e) 
{ 
    Focus(); 
    BringToFront(); //bring to front works! maybe it means focus should work also? 
} 

在承載該用戶控件的形式,我有KeyPreview設置爲True但我也有其他事件onthis形式。也許這就是爲什麼我不能在自定義控件中獲得按鍵?

private void MainForm_KeyDown(object sender, KeyEventArgs e) 
    { 
     if (e.Modifiers == Keys.Control) 
     { 
      projectBrowser.ControlKeyIsDown = true; 
      e.Handled = true; 
     } 
    } 

    private void MainForm_KeyUp(object sender, KeyEventArgs e) 
    { 
     if (e.KeyCode == Keys.LControlKey || e.KeyCode == Keys.RControlKey || e.KeyCode == Keys.ControlKey || e.KeyCode == Keys.Control) 
     { 
      projectBrowser.ControlKeyIsDown = false; 
      e.Handled = true; 
     } 
    } 

這裏是程序的樣子: enter image description here

回答

0

一種方式來處理,這是重寫窗體的ProcessCmdKey方法。在調度到目標控件(帶焦點的控件)之前,您將收到WM_KEYDOWN消息。在那裏你可以執行自己的邏輯來處理鍵擊,並允許或禁止進一步處理消息。