Я хочу перетащить изображение из элемента Silverlight UIElement и поместить его на рабочий стол пользователя или в проводник Windows. - PullRequest
7 голосов
/ 24 августа 2011

У меня есть элемент управления 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);

Ответы [ 3 ]

4 голосов
/ 24 августа 2011

Ну, проблема в том, что операция перетаскивания в Silverlight не имеет простого доступа к чему-либо за пределами браузера (по замыслу). В зависимости от настроек пользователя вам даже нужно получить явное разрешение на операции с буфером обмена и временное хранилище файлов в песочнице. Это действительно похоже на задачу, лучше подходящую для приложения WPF (возможно, с веб-развертыванием ?) Или какой-либо другой технологией настольных приложений.

Однако, сказанное здесь - это то, что вы можете попробовать / рассмотреть:

  1. Сочетание Silverlight / Javascript / ActiveX, размещенное в Internet Explorer
  2. Silverlight 5 "Out of Brower" & P / Invoke (я слышал, что P / Invoke будет поддерживаться, когда выйдет Silverlight 5)
  3. Silverlight, подключающийся к веб-службе, работающей на том же компьютере (сумасшедший, но вы не просили «не сумасшедший», вы спрашивали о возможном)

Я не очень хорошо знаком с перетаскиванием в Win32 API, поэтому потребовалось бы много исследований и экспериментов, прежде чем я смог бы подтвердить, что это вообще возможно (и я уже могу сказать, что это не практично).

Редактировать : На основании предоставленной вами дополнительной информации по вопросу, который я подозреваю, можно сделать то, что вы пытаетесь. Во-первых, вы используете WPF или WinForms? Я предполагаю, WPF, но один из ваших комментариев говорит WinForms. Я не был очень знаком с операциями перетаскивания WPF, но, посмотрев на них, я думаю, ваш код находится на правильном пути. Я создал приложение WPF и инициировал перетаскивание во время события KeyDown. Это означало, что кнопка мыши не обязательно была нажата. Если я инициировал DragDrop, когда кнопка была нажата , она работала. Если бы я инициировал, когда кнопка мыши не была внизу, мне пришлось бы нажать кнопку мыши вниз, и операция перетаскивания началась бы (это было неожиданно, так как я предполагал, что мышь уже должна быть нажата). Если я нажал кнопку мыши вне приложения, затем выделил фокус приложения WPF (ALT + Tab), а затем вызвал DragDrop, пока кнопка мыши была еще нажата, это не сработало. Я получил ссылку на MouseDevice и проверил свойство LeftButton, и состояние показывалось как «Выпущено», хотя кнопка все еще удерживалась. Похоже, ключом здесь является то, как перетаскивание взаимодействует с внутренним состоянием мыши. Возможно, вам придется найти способ установить состояние мыши (может быть, с помощью API автоматизации пользовательского интерфейса?). В этот момент должно быть до боли очевидно, что все это взлом (хотя, возможно, можно заставить его работать как-то).

2 голосов
/ 01 сентября 2011

Решение, которое мы нашли, было следующим.RIA, т.е. Silverlight, отправляет сообщение в наше настольное приложение WinForms с указанием пути к изображению для перетаскивания вместе с ограничительным прямоугольником в экранных координатах, с которого мы хотим начать перетаскивание.Код рабочего стола создает и размещает панель над областью, из которой мы хотим перетащить.На этой панели мы используем DoDragDrop, чтобы инициировать собственное перетаскивание, когда пользователь щелкает левой кнопкой мыши.Так как эта панель находится снаружи и над регулятором silverlight, все работает идеально.Песочница победила.

0 голосов
/ 24 августа 2011

Последние несколько месяцев я работал над некоторыми приложениями Silverlight и полностью изучил ваши точные требования, но обнаружил, что это невозможно. Я считаю, что вы можете перетаскивать файлы из файловой системы, из элемента управления Silverlight в элемент управления, но не в файловую систему.

Поддерживает ли Silverlight 4 перетаскивание из приложения на рабочий стол?

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...