.NET - Способ добавить мой собственный формат буфера обмена к существующим форматам

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

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

В настоящее время, когда я использую класс Буфера обмена в.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

5
задан A9S6 3 February 2010 в 09:19
поделиться

1 ответ

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

3
ответ дан 15 December 2019 в 06:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: