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