肯定有一种方便的方法:
我已经在我的主窗体上实现了鼠标拖动行为的"移动窗口",
我希望鼠标单击/移动事件被表单拦截,而不是由其中的控件拦截.
我想找到一个等效/复制鼠标事件的"KeyPreview"属性
此外,我想避免在12个控件的鼠标事件中单独将鼠标事件重定向到主窗体方法12次(这是我到目前为止找到的丑陋的解决方法)
有任何想法吗 ?
订阅所有控件MouseMove事件(考虑对嵌套控件进行递归操作)
foreach (Control control in Controls)
control.MouseMove += RedirectMouseMove;
Run Code Online (Sandbox Code Playgroud)
并在此事件处理程序中引发MouseMove
private void RedirectMouseMove(object sender, MouseEventArgs e)
{
Control control = (Control)sender;
Point screenPoint = control.PointToScreen(new Point(e.X, e.Y));
Point formPoint = PointToClient(screenPoint);
MouseEventArgs args = new MouseEventArgs(e.Button, e.Clicks,
formPoint.X, formPoint.Y, e.Delta);
OnMouseMove(args);
}
Run Code Online (Sandbox Code Playgroud)
请记住,控件接收具有本地控制坐标的MouseEvents.所以你需要将它转换为表格坐标.嵌套控件可能有缺点,但我留给你(例如调用Parent.PointToClient)
更新:您仍然可以处理控制事件 - 只需再次订阅事件.
根据您的评论,
在基类中实现鼠标事件的重定向功能,然后使所有控件都从该基类派生。
因此,您只需实现该功能一次,然后所有控件将“重新抛出”鼠标事件以由主窗体捕获。
希望这可以帮助。