Почему мои данные из буфера обмена исчезли после закрытия формы? - PullRequest
0 голосов
/ 27 января 2020

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

Я уже пробовал копировать что-то уже (отдельно):

Dim data As String = RichTextBox1.SelectedRtf

Clipboard.SetText(data, TextDataFormat.Rtf)
Clipboard.SetData(DataFormats.Rtf, data)
Clipboard.SetDataObject(data, True)
RichTextBox1.Copy()

С и без указания RTF, результат остается то же. Также с обычной строкой текста и / или при использовании комбинации клавиш CTRL + C. А также при передаче «True» в качестве параметра в SetDataObject или нет, ничего не меняется.

Я открыл окно WordPad, чтобы проверить это; копирование и вставка, когда диалог все еще открыт, приводит к обычной вставке. Закрытие диалогового окна (но не приложения) очищает буфер обмена и повторное вставление приводит к тому, что ничего не появляется или появляется новая строка.

Кто-нибудь, кто знает, почему происходит такое поведение и как его исправить?

Заранее спасибо!

1 Ответ

1 голос
/ 28 января 2020

Прежде всего, каждый из этих вызовов буфера обмена полностью заменяет содержимое буфера обмена, поэтому выполнение их всех подряд не работает; только последний действительно будет иметь какой-либо эффект.

Что касается вашей проблемы, проблема в том, что Clipboard.SetDataObject действительно может использоваться с любым объектом, но затем он автоматически определяет тип, поэтому он, вероятно, просто посмотрите, что это String и введите его как Text, а не RTF. Тем не менее, предназначенный способ его использования, который крайне недооценен в документах MSDN , связан с объектом класса DataObject. Я не уверен, почему они не сделали определенные перегрузки c SetDataObject(DataObject, ...) для этого; это сделало бы вещи намного более понятными для пользователей. Честно говоря, мне кажется, что они не ленились.

Так что, в любом случае, использовать перегрузку Clipboard.SetDataObject(?, True), которая обеспечивает сохранение данных после закрытия приложения, и чтобы он правильно установил ваш тип контента, вам нужно сделать первый аргумент объектом этого DataObject класса. Поэтому сначала создайте New DataObject, затем вставьте строку в SetData, что позволяет явно указать тип, и, наконец, вызовите функцию SetDataObject с вашим DataObject и аргументом для сохранения данных в буфере обмена.

' Get rich text snippet
Dim data As String = RichTextBox1.SelectedRtf
' Create data object
Dim dataObj As New DataObject()
' Put rich text snippet in data object
dataObj.SetData(DataFormats.Rtf, data)
' Put data object in clipboard, using the "copy=True" argument.
Clipboard.SetDataObject(dataObj, True)

Обратите внимание, что DataObject - это коллекция данных буфера обмена, предназначенная для того, чтобы помещать объекты в буфер обмена несколькими типами одновременно . Например, вы можете добавить фрагмент как в формате RTF, так и в виде простого текста, гарантируя, что ваш скопированный контент также может быть вставлен в такие приложения, как Блокнот:

Dim dataObj As New DataObject()
dataObj.SetData(DataFormats.Text, RichTextBox1.SelectedText)
dataObj.SetData(DataFormats.Rtf, RichTextBox1.SelectedRtf)
Clipboard.SetDataObject(dataObj, True)
...