我想从Silverlight UIElement拖动一个图像并将其放在用户桌面或Windows资源管理器上

我有一个包含图像的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应用程序(可能是Web部署 ?)或其他桌面应用程序技术的任务。

但是,这里说的是你可以尝试/考虑的一些事情:

  1. Internet Explorer中托管的Silverlight / Javascript / ActiveX组合
  2. Silverlight 5“Out of Brower”和P / Invoke(我听说当Silverlight 5问世时会支持P / Invoke)
  3. Silverlight连接到在同一台计算机上运行的Web服务(疯了,但你没有要求“不要疯狂”,你要求可能)

我对Win32 API中的拖放并不是很熟悉所以在我确认这甚至可能之前需要进行大量的研究和实验(我已经可以告诉你它不实用)。

编辑 :根据您提供的有关问题的额外信息,我怀疑您可以执行您正在尝试的操作。 首先,您使用的是WPF还是WinForms? 我假设WPF,但你的一条评论说WinForms。 我对WPF拖放操作不太熟悉,但仔细研究过,我认为你的代码是在正确的道路上。 我创建了一个WPF应用程序,并在KeyDown事件期间启动了拖动。 这意味着鼠标按钮不一定按下。 如果我在按钮关闭时启动了DragDrop ,它就可以工作了。 如果我在鼠标按钮没有按下时启动,我不得不按下鼠标按钮并开始拖动操作(这是意料之外的,因为我认为鼠标必须已经关闭)。 如果我在应用程序外面按下鼠标,然后给出WPF应用程序焦点(ALT + Tab),然后在鼠标按钮仍然按下时启动DragDrop ,它不起作用。 我得到了对MouseDevice的引用并检查了LeftButton属性,并且状态显示为“已释放”,即使该按钮仍处于按下状态。 这里的关键似乎是拖放与内部鼠标状态交互的方式。 您可能必须找到一种设置鼠标状态的方法(可能使用UI Automation API?)。 在这一点上,显而易见的是,整个事情都是黑客攻击(即使它可能以某种方式使其工作)。

我们提出的解决方案如下。 RIA即Silverlight向我们的桌面应用程序WinForms发送一条消息,其中图像的路径与我们想要开始拖动的屏幕坐标中的边界矩形一起拖动。 桌面代码创建并将Panel放在我们要拖动的区域上。 此面板是我们使用DoDragDrop在用户单击时启动本机拖动的位置。 由于此面板位于silverlight控件的外部和上方,因此一切都很完美。 沙盒击败了。

我在过去的几个月里一直在研究一些Silverlight应用程序,并且只是发现它不可能完全调查你的确切要求。 我相信你可以从文件系统,从Silverlight控件拖动到控件,但不能拖到文件系统。

Silverlight 4是否支持从应用程序拖放到桌面?

http://msdn.microsoft.com/en-us/library/dd772166%28v=vs.95%29.aspx