【发布时间】:2010-07-29 03:19:40
【问题描述】:
我知道当拖放操作完成时,在接收到 MouseUp 或 Esc 键事件时,它会返回一个枚举,指示发生了什么(移动、复制、无等)。我的问题是:是否有一个将状态信息发送回发起拖动事件的表单/控件的方法,而它正在进行?
用例如下(想想所有这一切的 Visual Studio 式布局管理器):我正在编写一个布局/窗口管理组件,它允许拖动布局的区域。我使用透明表单绘制半透明叠加层,该叠加层会根据鼠标拖动的位置而变化,例如在 Visual Studio 中拖动窗口时出现的预览叠加层。
另一个动机是我描述的序列化过程是相对资源密集型的,如果拖动都将发生在同一个进程/窗口中,我不希望这样做。因此,如果有一种方法可以仅在另一个窗口中发生实际“拖放”时才进行延迟序列化,那可能会在可用性方面产生重大影响。
我想做的是在不同的窗口甚至应用程序的不同实例之间启用拖动。我已经查明了序列化代码和所有内容,但问题是,当我将一大块布局拖到另一个窗口时,第一个窗口无法知道鼠标现在位于另一个实例上应用程序,它不仅能够绘制其自己的叠加层。所以,原来的叠加层像个白痴一样到处乱晃,我的程序看起来很垃圾。
有什么方法可以让我传递某种回调,或者是否有任何消息或属性我可以在拖动操作期间侦听/轮询,这将告诉我我的鼠标指针是否位于可以接受其数据的区域上?请不要让我诉诸于听 CursorChanged 事件,我已经失去了太多的自尊,使用反射来破解奇怪的 wpf/winforms 拖动互操作错误。如果有人能为这个问题提出一个干净的解决方案,我将非常感激。
此外,如果有人能指出我最喜欢的网站,这些网站描述了如何通过拖放来做一些非常时髦的事情,我将不胜感激,因为我发现缺乏真正的细节信息关于拖动。像自定义光标之类的通常的东西还可以,但我可能对 Win32 黑艺术之类的更感兴趣。
更新: 实际上,我刚刚发现了一秒钟前的 GiveFeedback 事件,回到我的问题,它就在那里。巨大的掌心时刻。但是,既然我把你带到了这里,那么我的第二个问题呢:有没有办法只在遇到有效目标时才延迟加载信息?我可以以某种方式实现我自己的 IDataObject 或者当鼠标离开表单时是否可以正确编组? GiveFeedback 仅向我提供光标下是否存在有效目标,但不允许我更改正在拖动的数据...
另一个更新: 有什么方法可以确定拖动操作的来源吗?也就是说,当我的控件收到 DragEnter 消息时,我如何判断拖动的来源是我自己的控件还是外来的?我知道我可以通过弄乱 AllowedEffects 属性来对它进行 hackishly 编码,但是还有更直接的路线吗?
【问题讨论】:
标签: c# .net winforms drag-and-drop