Прежде всего, каждый из этих вызовов буфера обмена полностью заменяет содержимое буфера обмена, поэтому выполнение их всех подряд не работает; только последний действительно будет иметь какой-либо эффект.
Что касается вашей проблемы, проблема в том, что 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)