每次我想让用户拖动一个控件时,我都会调用该控件的 DoDragDrop 。
拖放工作正常,但我对周围的事情有问题:
DoDragDrop 完全阻塞表单,没有计时器事件跳转,没有处理绘制消息。
DoDragDrop 不仅会阻止拖放操作,还会阻止目标程序完成拖放事件(即 explorer.exe 的糟糕代码)。依赖其他程序的代码很糟糕。
我想从新线程调用 DoDragDrop 。
尝试过这个:
Thread dragThread = new Thread(() =>
{
Form frm = new Form();
frm.DoDragDrop("data", DragDropEffects.All);
});
dragThread.SetApartmentState(ApartmentState.STA);
dragThread.IsBackground = true;
dragThread.Start();
但它似乎不起作用。我的意思是:当像这样从其他线程执行 DoDragDrop 时,我的程序或其他程序中的其他控件不会接收拖放消息。
还有其他解决方案吗?
The 拖放操作方法停止处理事件,直到第一个鼠标事件(例如鼠标移动)。所以我发现的解决方法非常简单 - 您只需要在调用 DoDragDrop 之前使用相同的鼠标位置模拟鼠标事件:
void XYZControl_MouseDown(object sender, MouseEventArgs e)
{
var senderControl = (Control) sender;
...
Cursor.Position = senderControl.PointToScreen(new Point(e.X, e.Y)); // Workaround!
if (DoDragDrop(senderControl, DragDropEffects.Move) == DragDropEffects.Move)
{
...
}
....
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)