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"