我有一个包含图像的 Silverlight 控件。我希望用户能够将图像拖出 Silverlight 应用程序并将其放置在他们能够放置图像的任何位置。例如,到桌面或 PowerPoint 幻灯片或 Word 文档。到目前为止,我读到的所有内容都表明这是不可能完成的,但我发现这很难相信。我对 Silverlight 和 RIA 开发非常陌生,因此我们将不胜感激。
下面是我的 WinForm 表单中的代码示例,但拖动从未开始。
string[] aString = { imagePath };
DataObject data = new DataObject(DataFormats.FileDrop, aString);
data.SetData(DataFormats.StringFormat, imagePath);
DoDragDrop(data, DragDropEffects.Copy);
问题在于 Silverlight 中的拖动操作无法简单地访问浏览器之外的任何内容(按照设计)。根据用户的设置,您甚至必须获得剪贴板操作和沙盒临时文件存储的明确权限。这听起来确实是一个更适合 WPF 应用程序的任务(也许使用网络部署 http://msdn.microsoft.com/en-us/library/aa969776.aspx?)或其他一些桌面应用程序技术。
然而,这里所说的是您可以尝试/考虑的一些事情:
- Internet Explorer 中托管的 Silverlight/Javascript/ActiveX 组合
- Silverlight 5“Out of Brower”和 P/Invoke(听说 Silverlight 5 出来时将支持 P/Invoke)
- Silverlight 连接到在同一台计算机上运行的 Web 服务(疯狂,但你没有要求“不疯狂”,你要求的是可能)
我对 Win32 API 中的拖放操作不太熟悉,因此需要进行大量研究和实验才能确认这是否可行(而且我已经可以告诉您这是不切实际的)。
Edit:根据您提供的有关该问题的额外信息,我怀疑可以做您正在尝试的事情。首先,您使用的是 WPF 还是 WinForms?我假设是 WPF,但您的评论之一是 WinForms。我不太熟悉 WPF 拖/放操作,但经过研究后,我认为您的代码处于正确的路径上。我创建了一个 WPF 应用程序并在KeyDown
事件。这意味着鼠标按钮不一定被按下。如果我发起DragDrop
当按钮was下来它起作用了。如果我在鼠标按钮时启动wasn't向下,我必须按下鼠标按钮,然后拖动操作就会开始(这是意外的,因为我认为鼠标必须已经按下)。如果我在应用程序外部按下鼠标,然后给予 WPF 应用程序焦点 (ALT+Tab),然后启动DragDrop
当鼠标按钮仍然按下时,它不起作用。我得到了一个参考MouseDevice
并检查了LeftButton
属性,并且状态显示为“已释放”,即使按钮仍被按住。看来这里的关键是拖放与内部鼠标状态交互的方式。您可能必须找到一种方法来设置鼠标状态(也许使用 UI Automation API?)。在这一点上,很明显这整件事都是一个黑客行为(尽管可能有可能让它以某种方式工作)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)