C # / WPF: Могу ли я хранить более одного типа в буфере обмена? - PullRequest
8 голосов
/ 15 октября 2010

Могу ли я хранить более 1 типа в буфере обмена? Например. как текст и изображение. скажем, пользователь вставляет текстовый редактор, он получает текст, а если он вставляет что-то вроде фотошопа, он получает изображение. Я думал, что это возможно, но я пытался

Clipboard.Clear();
Clipboard.SetText(img.DirectLink);

BitmapImage bitmapImage = new BitmapImage();
bitmapImage.BeginInit();
bitmapImage.UriSource = new Uri(img.DirectLink);
bitmapImage.EndInit();

Clipboard.SetImage(bitmapImage);

и я всегда получаю изображение

Ответы [ 2 ]

11 голосов
/ 15 октября 2010

Да, это возможно.Основная проблема заключается в том, что вы используете методы очистки буфера обмена перед помещением данных (поэтому, в частности, они называются «Set ...» вместо «Add ...»).

Clipboard.SetText (WinForms) / Clipboard.SetText (WPF) описание из MSDN:

(WinForms): очищает буфер обмена, а затем добавляет текстовые данные в формате Text или UnicodeText,в зависимости от операционной системы.

Но решение относительно простое:

Чтобы поместить данные в буфер обмена в нескольких форматах, используйте класс DataObject или реализацию IDataObject.Поместите данные в буфер обмена в нескольких форматах, чтобы максимально увеличить вероятность того, что целевое приложение, требования к формату которого вы, возможно, не знаете, может успешно извлечь данные.

Проверьте MSDN для получения подробной информации:


ОБНОВЛЕНИЕ:

Добавлены ссылки на WPFварианты.

Чтобы уточнить комментарий @ Björn:

На странице MSDN для System.Windows.Clipboard.SetText () не указывается, что буфер обмена очищен, хотя, похоже, этов таком случае

Оба метода (WPF / WinForms) внутренне вызывают OleSetClipboard , поэтому поведение аналогично (вы можете проверить http://referencesource.microsoft.com/#q=Clipboard.SetText).

Я также проверил обаварианты (WinForms / WPF) в консольном приложении и обнаружили, что они делают то же самое.

5 голосов
/ 14 июня 2016

Как говорит Ник в принятом ответе: вы должны использовать DataObject (или IDataObject), чтобы использовать несколько форматов (в противном случае каждый Set-вызов сначала очистит буфер обмена).
Вот пример кода:

BitmapImage bitmapImage = new BitmapImage();
bitmapImage.BeginInit();
bitmapImage.UriSource = new Uri(img.DirectLink);
bitmapImage.EndInit();

DataObject d = new DataObject();
d.SetImage(bitmapImage);
d.SetText(img.DirectLink);
Clipboard.SetDataObject(d);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...