我有一个可拖动的控件(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方法?
编辑-关于事件序列的更多细节:
单击按钮时,我会看到以下事件序列:
MouseDownMouseDown (拖动处理程序)MouseDown (拖动处理程序)MouseUp我从来没有在按钮上看到过MouseUp事件。
发布于 2013-06-19 11:28:50
我不知道您使用什么样的Control作为容器,因为我已经用UserControl进行了测试,我可以与UserControl的所有子级交互,但是如果您只想单击这些子容器,我有以下解决方案:
[DllImport("user32")]
private static extern IntPtr WindowFromPoint(POINT point);
[DllImport("user32")]
private static extern int SendMessage(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam);
struct POINT
{
public int x, y;
}
private void MouseUp(object sender, MouseEventArgs e){
if(DragHasStarted){
DealWithDrag();
}
else {
Point screenLocation = PointToScreen(e.Location);
IntPtr childHandle = WindowFromPoint(new POINT{x=screenLocation.X,y=screenLocation.Y });
if(childHandle != IntPtr.Zero){
SendMessage(childHandle, 0x201, IntPtr.Zero, IntPtr.Zero);
SendMessage(childHandle, 0x202, IntPtr.Zero, IntPtr.Zero);
}
}
}https://stackoverflow.com/questions/17188074
复制相似问题