我有一个可拖动的控件 (A),里面是一个按钮。A内部还有其他控件,即按钮不填A。
为了管理拖动功能,控件 (A) 捕获任何MouseDown
事件。它稍后会根据鼠标移动的距离决定是否开始拖动。
如果单击按钮,然后MouseUp
在开始拖动之前收到事件,我希望Click
触发按钮的事件。
目前,这不会发生,因为MouseUp
事件被父控件 (A) 捕获。我可以在 A 上实现功能来手动处理这个:
private void MouseUp(object sender, MouseEventArgs e) {
if (DragHasStarted) {
DealWithDrag();
}
else {
DelegateToChildControls();
}
}
然而,这很复杂并且不能很好地扩展,因为DelegateToChildControls
需要确定要委托给哪个孩子。
如果父控件不处理MouseUp
事件,有没有办法让 Windows 处理这个并直接调用按钮的 Click 方法?
编辑 - 有关事件序列的更多详细信息:
单击按钮时,我看到以下事件序列:
MouseDown
开按钮MouseDown
on 按钮(拖动处理程序)- 我将此转发给按钮的父级
MouseDown
在父级(拖动处理程序)- 鼠标被父级捕获(拖动处理程序)
MouseUp
在父母身上- 结束拖动(拖动处理程序)
我从来没有MouseUp
在按钮上看到任何事件。