PowerPoint Interop: копирование и вставка фигуры приводит к сбою, если выполняется слишком быстро

Я использую Microsoft.Office.Interop.PowerPoint в программе C# /. NET, чтобы автоматизировать некоторые операции с файлом PPTX.

Я пытаюсь создать копию существующей фигуры в презентации с помощью этого кода:

      var shape = slide.Shapes[1];
shape.Copy();
var newShape = targetSlide.Shapes.Paste();

однако инструкция ненадежна, иногда она работает, но иногда (по-видимому, наугад) выдает следующее исключение:

ОШИБКА: System.Runtime.InteropServices.COMException (0x80048240): фигуры (неизвестный член): недопустимый запрос. Буфер обмена пуст или содержит данные, которые нельзя сюда вставить. в Microsoft.Office.Interop.PowerPoint.Shapes.Paste()

Поработав немного и поискав в Интернете, я обнаружил, что проблема в том, что .Copy()инструкция явно асинхронна, в основном, когда она возвращается, нет гарантии, что объект формы действительно был скопирован в буфер обмена. Фактически, добавление:

      Thread.Sleep(1000);

между Copy() а также Paste() инструкция устраняет проблему.

Однако сон не является правильным решением, он сильно замедляет работу программы, и невозможно узнать, слишком ли вы установили время сна.

У меня вопрос: есть ли более надежный способ дождаться «готовности» копии перед вставкой?

1 ответ

Я могу опоздать, но вот мое решение: это случилось со мной, когда я повторял фигуры на слайде. Копирование каждого и вставка каждого иногда вызывает указанную вами ошибку. Что я сделал, так это то, что я скопировал формы все сразу.

      CurrentSelection.SlideRangle.Shapes.Copy();
targetPresentation.Slides[index].Shapes.Paste();

Другой идеей было бы скопировать весь слайд:

      CurrentSelection.SlideRangle.Shapes.Copy();

а потом

      Globals.ThisAddIn.Application.CommandBars.ExecuteMso("PasteSourceFormatting");

вы также можете использовать "PasteDestinationTheme"

Другие вопросы по тегам