2010-01-04 74 views
2

我有一個自定義容器控件(派生自FlowLayoutPanel),其中包含零個或多個用戶拖動的子控件。當點擊一個子控件時,它被「選中」。 (這是繪製彩色邊框和選項可用於改變它的性質。)如何讓KeyDown事件在自定義容器控件中觸發?

我想處理Delete鍵,這樣,如果用戶目前在容器控件工作(控制或內點擊例如子控件),當前選定的控件(如果有的話)被刪除。

我已經使用子項上的右鍵單擊上下文菜單使用了刪除功能。我的問題是處理Delete鍵。我無法弄清楚如何讓我的容器控件中引發KeyDown事件。我知道這與焦點有關,因此必須調用Control.Select()(或其等價物),但是最好的方法是什麼?這個焦點邏輯在哪裏?或者,還有更好的方法?

我不想在表單中處理KeyDown事件,然後嗅探焦點在哪裏。這是一個可重複使用的容器控件,我希望邏輯駐留在那裏。

我需要做些什麼才能讓KeyDown事件在自定義控件上觸發?

public class MyContainer : FlowLayoutPanel 
{ 
    protected override void OnKeyDown(KeyEventArgs e) 
    { 
     if (e.KeyCode == Keys.Delete) 
     { 
      MessageBox.Show("How do I get here?"); 
      e.Handled = true; 
     } 

     base.OnKeyDown(e); 
    } 
} 

回答

1

是否有可能拖入容器的項目正在接收事件?

也許在物品進入您的容器後,您需要將焦點手動設置到容器中。

+0

感謝您的回覆。這使我找到了一個解決方案。兒童控制也無法獲得重點,所以沒有辦法說什麼「嘿!我現在有重點!」在我的整個控制範圍內。我在我的子控件的OnMouseDown方法覆蓋中做了一個Control.Select()。然後我可以在那裏處理OnKeyDown事件。如果我必須在容器中處理它,我可以執行你的建議或重寫ProcessKeyPreview方法,後者看起來像一個痛苦。 :) – 2010-01-04 21:17:01

2

對於MSDN上的FlowLayoutPanel控件,KeyDown事件被列爲無意義的。建議PreviewKeyDown事件作爲替代。

+0

感謝您的建議。 PreviewKeyDown事件也未在我的場景中觸發。當我一直在玩它時,我意識到我上面的問題可能太簡單了。我的容器控件託管在UserControl中,這似乎使生活更加複雜。 – 2010-01-04 21:05:31

相關問題