Перетаскивание WPF во внешнее приложение (Outlook) - PullRequest
0 голосов
/ 05 марта 2020

Я пытаюсь реализовать некоторые дополнительные функции Drag & Drop в своем приложении WPF. У меня работает Drag & Drop, когда источник и цель находятся внутри моего приложения, но Мне нужно иметь возможность перетаскивать данные из моего приложения в Outlook (приложение для настольных компьютеров) и загружать их в виде файла при удалении .

Я знаком со стандартным методом DragDrop.DoDragDrop () и событиями, связанными с типичными перетаскиваниями.

Текущая разметка:

MouseLeftButtonDown="Data_MouseLeftButtonDown"

Код обработчика текущего события:

/// Getting the data that we want to export (For example only)
private void Data_MouseLeftButtonDown(object sender, System.Windows.Input.MouseButtonEventArgs e)
{
    // Write data to a file (For example only)
    var fileToExport = File.ReadAllLines("C:\\test.txt");

    if (e.OriginalSource is Grid grid && grid.DataContext is CustomDataObject cdo)
    {
        DragDrop.DoDragDrop(ControlGoesHere, fileToExport, DragDropEffects.Copy);
    }
}

Я пробовал большинство, если не все, других решений SO, которые я исследовал, но Я все еще не могу перенести эти данные в Outlook. Кроме того, я отключил «Просто мой код» и включил все исключения CLR и увидел, что это исключение выдается:

System.Runtime.InteropServices.COMException: 'Invalid FORMATETC structure (Exception from HRESULT: 0x80040064 (DV_E_FORMATETC))'

Насколько я понимаю, DoDragDrop создает объект DataObject на основе данных, которые вы передаете, и что вы может создать экземпляр DataObject вручную, прежде чем передать его для большего контроля, и т. д. c, но до сих пор у меня не работает ни одна конфигурация.

Есть несколько вещей, в которых я не уверен

  • Должны ли данные, которые «экспортируются», поступать из системы контроля версий? (Мне успешно удалось экспортировать строку «Test» в Outlook, которая была не из элемента управления.
  • Чтобы DoDragDrop возвратил что-то, я должен нажать Ctrl или другие клавиши, это из-за настройки моей текущей реализации неправильно обрабатывается логарифм отбрасывания c (например, с помощью QueryContinueDrag?

WPF,. NET Framework 4.6.1

Я могу предоставить дополнительную информацию по запросу, просто дайте мне знать. Заранее спасибо!

1 Ответ

0 голосов
/ 06 марта 2020

Outlook должен знать, что он получает. Для этого вы создаете объект DataObject и присваивает ему тип формата FileDrop. FileDrop ожидает строку [] в качестве значения объекта, поэтому используйте строку [] для ввода пути к файлу или путей, если у вас их больше одного. НЕ пытайтесь прочитать весь файл.

string[] files = new string[1];
files[0] = ""; //fill this in with the file PATH
DataObject data = new DataObject(DataFormats.FileDrop, files);
DragDrop.DoDragDrop(listTest, data, DragDropEffects.Copy);

Благодаря этому я смог перетащить элемент в область сообщения электронной почты Outlook и прикрепить к нему файл с указанным мной путем.

...