.NET - способ добавить свой собственный формат буфера обмена в существующие форматы - PullRequest
5 голосов
/ 03 февраля 2010

У меня есть надстройка для Excel, которая отображает некоторые структуры на листе. Пользователи могут копировать структуры и вставлять их в другой лист или другое приложение, которое обрабатывается форматами буфера обмена. Когда пользователь копирует структуру, я конвертирую ее в определенный формат и помещаю в буфер обмена, используя DataObject :: SetData (). Обратите внимание, что когда копия инициируется в Excel, она помещает несколько форматов в буфер обмена (см. Изображение).

Проблема в том, что существует стороннее приложение, которое зависит от данных в буфере обмена (скопируйте из Excel и вставьте в это стороннее приложение), но забавно то, что я не уверен, от какого формата это зависит. Мне нужно сохранить существующие форматы, которые там выложил Excel, а также добавить свой собственный формат.

В настоящее время, когда я использую класс Clipboard в .NET (беря DataObject и вызывая SetData внутри него), все остальные форматы заменяются новыми. Затем я попытался создать новый объект DataObject, скопировать данные существующего формата в этот объект данных и затем установить этот объект данных в буфере обмена. Это прекрасно работает, но копирование данных занимает время.

 // Copying existing data in clipboard to our new DataObject
 IDataObject existingDataObject = Clipboard.GetDataObject();
 DataObject dataObject = new DataObject();

 string[] existingFormats = existingDataObject.GetFormats();
 foreach (string existingFormat in existingFormats)
        dataObject.SetData(existingFormat, existingDataObject.GetData(existingFormat));

Я ищу решение, позволяющее просто получить доступ к существующему объекту DataObject и спокойно добавлять в него свои собственные данные, не затрагивая другие форматы.

Форматы буфера обмена Excel - (Игнорировать собственный формат)

Форматы буфера обмена http://www.freeimagehosting.net/uploads/258a7fcdd8.jpg

1 Ответ

3 голосов
/ 09 июня 2010

Вы можете создать класс-оболочку для объекта IDataObject, который вы получаете из буфера обмена Windows, чтобы добавить свои данные. Идея состоит в том, что оболочка будет знать о ваших пользовательских форматах и ​​делегировать исходный, упакованный IDataObject для всех других форматов.

Вот частичная реализация, показывающая конструктор и одну из реализаций метода IDataObject:

public class MyDataObject : IDataObject
{
    public MyDataObject(IDataObject inner, string format, Type type, object data)
    {
        m_inner = inner;
        m_format = format;
        m_type = type;
        m_data = data;
    }
    private IDataObject m_inner;
    private string m_format;
    private Type m_type;
    private object m_data;

    object IDataObject.GetData(string format)
    {
        // if my format, return the wrapper data
        if (format == m_format)
            return object;

        // otherwise, delegate to the wrapped data object which holds
        //  the other formats
        return m_inner.GetData(format);
    }

    // implement the rest of IDataObject similarly
    ...
}

Одно предостережение: при извлечении системного буфера обмена IDataObject вам нужно будет проверить, является ли он одним из ваших объектов-оболочек. В этом случае вы не хотите продолжать упаковывать свои обертки. Вместо этого вам нужно либо изменить поля данных / формата существующей оболочки, либо создать новую оболочку для исходного объекта данных буфера обмена.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...