簡體   English   中英

我想將圖像從Silverlight UIElement拖放到用戶桌面或Windows資源管理器上

[英]I want to drag an image from a Silverlight UIElement and drop it on the users Desktop or Windows Explorer

我有一個包含圖像的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?)。 在這一點上,應該很明顯地看出這整個過程都是hack(即使有可能使它以某種方式工作)。

我們提出的解決方案如下。 RIA(即Silverlight)會向我們的桌面應用程序WinForms發送一條消息,其中包含要拖動的圖像的路徑以及要從其開始拖動的屏幕坐標中的邊界矩形。 桌面代碼創建一個面板並將其放置在我們要從中拖動的區域上。 在該面板上,我們使用DoDragDrop在用戶左鍵單擊時啟動本機拖動。 由於此面板放置在Silverlight控件的外部和上方,因此一切正常。 沙盒被擊敗。

在過去的幾個月中,我一直在研究某些Silverlight應用程序,並完全調查了您的確切要求,結果發現這是不可能的。 我相信您可以從文件系統拖動到Silverlight控件,但不能拖動到文件系統。

Silverlight 4是否支持從應用程序拖放到桌面?

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM