Кажется, что это ограничение / ошибка при автоматизации PowerPoint из C #.Я подтверждаю, что он работает с VBA.
Я вижу эффект после выполнения кода: он изменяет уровень first при каждом запуске, так что в конце первый уровень имеет настройкиэто должно было быть назначено последнему уровню, который будет обработан, но ни один из других уровней, видимо, не подвержен влиянию.Я вижу изменение значений, возвращаемых во время выполнения кода, но это все.
Если код изменяет только один, определенный уровень для текстового фрейма, он работает.Проблема возникает только при попытке изменить несколько уровней.
Я пробовал разные подходы, включая позднюю привязку (PInvoke) и внесение изменений в отдельную процедуру, но результат всегда был одинаковым.
Вот моя последняя итерация
Microsoft.Office.Interop.PowerPoint.Application pptApp = (Microsoft.Office.Interop.PowerPoint.Application) System.Runtime.InteropServices.Marshal.GetActiveObject("Powerpoint.Application"); // new Microsoft.Office.Interop.PowerPoint.Application();
//Change indent level of text
const float kIndentStep = 13.5f;
Microsoft.Office.Interop.PowerPoint.Shape shp = pptApp.ActivePresentation.Slides[2].Shapes[2];
Microsoft.Office.Interop.PowerPoint.TextFrame tf = shp.TextFrame;
object oTf = tf;
int indentLevelLast = 0;
foreach (Microsoft.Office.Interop.PowerPoint.TextRange pg in tf.TextRange.Paragraphs(-1, -1))
{
int indentLevel = pg.IndentLevel;
if (indentLevel > indentLevelLast)
{
Microsoft.Office.Interop.PowerPoint.RulerLevel rl = tf.Ruler.Levels[indentLevel];
object oRl = rl;
System.Diagnostics.Debug.Print(pg.Text + ": " + indentLevel + ", " + rl.FirstMargin.ToString() + ", " + rl.LeftMargin.ToString()) ;
object fm = oRl.GetType().InvokeMember("FirstMargin", BindingFlags.SetProperty, null, oRl, new object[] {kIndentStep * (indentLevel - 1)});
//rl.FirstMargin = kIndentStep * (indentLevel - 1);
object lm = oRl.GetType().InvokeMember("LeftMargin", BindingFlags.SetProperty, null, oRl, new object[] { kIndentStep * (indentLevel) });
//rl.LeftMargin = kIndentStep * indentLevel;
indentLevelLast = indentLevel;
System.Diagnostics.Debug.Print(pg.Text + ": " + indentLevel + ", " + tf.Ruler.Levels[indentLevel].FirstMargin.ToString() + ", " + tf.Ruler.Levels[indentLevel].LeftMargin.ToString()) ;
rl = null;
}
}
FWIW, ни один фрагмент кода, указанный в вопросе, не компилируется.Фрагмент VBA отсутствует .TextFrame
.Фрагмент C # не нравится Parent.Ruler
, поэтому мне пришлось изменить его на TextFrame.Ruler
.