如何使记事本(或任何其他文本编辑器)上粘贴的剪贴板上存储自定义对象?

时间:2018-03-22 07:18:49

标签: c# clipboard

我正在使用我的类对象的剪切复制粘贴功能。 我可以将数据保存在剪贴板上并为此目的将其恢复。

现在我想要的是通过 ctrl + V 在该文本编辑器提供的其他文本编辑器上获取相同的数据。或者

在剪贴板上设置数据的代码是:

  /// <summary>
  /// Set elements on the clipboard.
  /// </summary>
  /// <param name="object">object to be stored on the clipboard.</param>
  private static void SetElementsOnClipboard(CustomData object)
  {
     Tuple<string, Type> serializedElement = null;
     var data = new System.Windows.DataObject();
     serializedElement = new Tuple<string, Type>(SerialiseData(object), object.GetType());
     data.SetData("SomeKey", serializedElement);

     System.Windows.Clipboard.SetDataObject(data);
  }

此处方法SerialiseData(CustomData object)返回一个我想要粘贴到其他文本编辑器中的字符串对象。

我将不胜感激。

1 个答案:

答案 0 :(得分:0)

您可以以多种格式同时在剪贴板上设置数据。除了SetText之外,还加上SetData,其中包含对象的字符串表示形式,因此纯文字应用程序也可以粘贴它。

请注意,除非您需要在特定剪贴板ID下以特定格式接收该数据,you shouldn't need to serialize that object yourself;只要将[Serializable]属性设置在类的顶部,并确保内部数据由可序列化类型组成,系统就可以自行处理所有这些。事实上,即使剪贴板ID也可以被对象类型替换,如果您没有专门添加字符串ID,SetData会自动执行此操作。

/// <summary>
/// Set object on the clipboard, together with its string representation.
/// </summary>
/// <param name="myObject">object to be stored on the clipboard.</param>
public static void PutOnClipboardWithTextVersion<T>(T myObject) where T : class
{
    DataObject data = new DataObject();
    data.SetData(myObject); // identical to data.SetData(typeof(T), myObject);
    data.SetText(myObject.ToString());
    // The second arg makes the data stay available after the program closes.
    Clipboard.SetDataObject(data, true);
}

当然,您必须自己编写.ToString()实现。

注意:DataObjectClipboard不在System.Windows;他们在System.Windows.Forms。而且,我很确定你不能使用object作为变量名。

关于自动序列化的注意事项:这是检索对象的方法:

DataObject clipData = (DataObject)Clipboard.GetDataObject();
CustomData clipPaste = null;
if (clipData.GetDataPresent(typeof(CustomData)))
    clipPaste = clipData.GetData(typeof(CustomData)) as CustomData;