[英]Events preview of child controls on Parent control
有沒有辦法在父控件上觸發子控件事件?
示例:名為ControlA的自定義用戶控件,其中包含其他控件,例如PictureBox和Label。 將ControlA添加到窗體,並設置MouseClick事件。 如果用戶單擊控件的空白區域,則會觸發該事件,但是如果用戶單擊子控件(如PictureBox和Label),則不會發生任何事情。 這是因為子控件位於后台,並且將處理事件。
我發現的解決方案是添加:
public new event MouseEventHandler MouseClick
{
add
{
base.MouseClick += value;
foreach (Control control in Controls)
{
control.MouseClick += value;
}
}
remove
{
base.MouseClick -= value;
foreach (Control control in Controls)
{
control.MouseClick -= value;
}
}
}
但是我將需要對所有要使用的事件執行此操作,是否還有其他方法可以解決該問題,例如在子控件上設置一些屬性,因此我不需要“覆蓋”許多事件?
我也有類似的情況。 我使用了此解決方案,但對其進行了修改以處理我擁有的對象。 區別在於我有幾種不同類型的用戶組件,這些用戶組件由用戶組件和常規組件組成,但是我需要父組件來處理DragDrop的相關事件,這是因為父組件可以訪問所需的所有信息。 我將此解決方案修改為遞歸的((我不確定這是最佳解決方案,但是…),這為我節省了工作量。 我可以將其復制並粘貼到其他組件上,並根據特定情況修改事件處理程序。 它是這樣的:
private void HookChildrenEvents(Control control)
{
foreach (Control child in control.Controls)
{
if (child.Controls.Count > 0)
{
HookChildrenEvents(child);
}
child.DragEnter += child_DragEnter;
child.MouseHover += child_MouseHover;
child.MouseDown += child_MouseDown;
child.DragDrop += child_DragDrop;
child.AllowDrop = true;
}
}
創建一種方法來為所有子級關聯所需事件。 如果需要,可以創建一個反方法:UnhookChildEvents。
public void HookChildEvents()
{
foreach (Control child in this.Controls)
{
child.MouseClick += ChildOnMouseClick;
child.DragEnter += ChildOnDragEnter;
// ... add one for each event you care for.
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.