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

本文关键字:用户 资源管理器 Windows 桌面 图像 一个 ui 元素 Silverlight 拖动 | 更新日期: 2023-09-27 18:06:33

我有一个包含图像的Silverlight控件。我希望用户能够将图像拖出Silverlight应用程序,并将其放置在他们可以放置图像的任何地方。例如,到桌面或到PowerPoint幻灯片或Word文档。到目前为止,我读到的所有东西都说这是不可能做到的,但我觉得这很难相信。我对Silverlight和RIA开发非常陌生,所以任何帮助都将非常感激。

下面是我的WinForm Form的代码示例,但是拖动从未开始。

string[] aString = { imagePath };
DataObject data = new DataObject(DataFormats.FileDrop, aString);
data.SetData(DataFormats.StringFormat, imagePath);
DoDragDrop(data, DragDropEffects.Copy);

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

问题是,在Silverlight中拖动操作不能简单地访问浏览器外的任何内容(按设计)。根据用户的设置,您甚至必须获得剪贴板操作和沙盒临时文件存储的明确许可。这听起来像是一个更适合WPF应用程序(也许是web部署?)或其他桌面应用程序技术的任务。

然而,话虽如此,这里有一些事情你可以尝试/考虑:

  1. Internet Explorer中的Silverlight/Javascript/ActiveX组合
  2. Silverlight 5"Out of browser"& 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自动化API?)。在这一点上,它应该是痛苦的明显,这整个事情是一个hack(即使可能有可能使它工作)。

我们提出的解决方案如下:RIA(即Silverlight)向我们的桌面应用程序WinForms发送一条消息,其中包含要拖动的图像的路径以及我们想要开始拖动的屏幕坐标中的边界矩形。桌面代码在我们想要拖动的区域上创建并放置一个面板。在这个面板中,我们使用DoDragDrop在用户左键单击时启动原生拖动。因为这个面板是放在外面和上面的银光控制,一切工作完美。沙箱击败。

在过去的几个月里,我一直在开发一些Silverlight应用程序,并充分调查了您的确切需求,结果发现这是不可能的。我相信你可以从文件系统拖拽,从Silverlight控件拖拽到另一个控件,但不能拖拽到文件系统。

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

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