Clipboard.GetDataObject()始终返回null

时间:2019-01-21 18:45:12

标签: c# clipboard clipboarddata

我正在努力使用剪贴板复制/粘贴对象,因此我创建了一个非常简单的示例来演示该问题。

非常令人沮丧的是,相同的代码在更早的时候就工作了,最近又停止了,我无法弄清楚出了什么问题。

基本上,问题在于即使dataObject.GetDataPresent()之前返回true,dataObject.GetData()始终返回null。

我正在.Net 4.5上运行。

using System;
using System.Windows.Forms;

namespace WindowsFormsApp2
{
public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        var a = new TestClass();
        a.Name = "Test";
        a.Index = 1;
        a.Live = true;
        IDataObject dataObj = new DataObject();

        // Method 1 : Not working

        //dataObj.SetData(a);

        // Method 2 : also not working

        DataFormats.Format format = DataFormats.GetFormat(a.GetType().FullName);
        dataObj.SetData(format.Name, false, a);


        Clipboard.SetDataObject(dataObj, false);
    }

    private void button2_Click(object sender, EventArgs e)
    {
        IDataObject dataObject = Clipboard.GetDataObject();

        // Method 1 : Not working

        //if (dataObject.GetDataPresent(typeof(TestClass)))
        //{
        //  // Issue => retrievedObj is ALWAYS null
        //  var retrievedObj = dataObject.GetData(typeof(TestClass));
        //}

        // Method 2 : also not working

        if (dataObject.GetDataPresent(typeof(TestClass).FullName))
        {
            // Issue => retrievedObj is ALWAYS null
            var retrievedObj = dataObject.GetData(typeof(TestClass).FullName);
        }
    }
}

public class TestClass
{
    public string Name;
    public int Index;
    public bool Live;
}
}

请问有什么想法吗?

1 个答案:

答案 0 :(得分:0)

我正在回答自己的问题,以分享我的经验。

长话短说,在原始代码中,我想复制/粘贴一个对象,该对象引用的类型(XmlFont,我创建的包装器类型,允许序列化字体类型)没有明确标记为Serializable属性。不过,有趣的是,使用XmlSerializer已成功将该对象序列化到文件中,或从文件中序列化了该对象,因此对我来说这部分仍然不清楚。但是将XmlFont类型标记为Serializable可立即解决该问题。