Проблема с настройкой отступа элементов маркера в текстовом фрейме - PullRequest
0 голосов
/ 25 февраля 2019

Я пытаюсь перенести существующий код VBA в C #.Одна подпрограмма контролирует отступ элементов пули и примерно равна:

indentStep = 13.5
For Each parag In shp.TextRange.Paragraphs()
    parag.Parent.Ruler.Levels(parag.IndentLevel).FirstMargin = indentStep * (parag.IndentLevel - 1)
    parag.Parent.Ruler.Levels(parag.IndentLevel).LeftMargin = indentStep * (parag.IndentLevel)
Next parag

Код работает, но выглядит как чёрная магия.В частности, каждый раз, когда задаются поля конкретного правителя, ВСЕ НАДИНЫЕ поля правителей фактически устанавливаются.Но как-то соответствующая информация устанавливается.К сожалению, когда вы делаете то же самое в C #, результаты меняются.Следующий код не имеет видимого эффекта:

const float kIndentStep = 13.5f;
foreach (PowerPoint.TextRange pg in shp.TextFrame.TextRange.Paragraphs())
{
pg.Parent.Ruler.Levels[pg.IndentLevel].FirstMargin = kIndentStep * (pg.IndentLevel - 1);
pg.Parent.Ruler.LevelS[pg.IndentLevel].LeftMargin = kIndentStep * pg.IndentLevel;
}

1 Ответ

0 голосов
/ 25 февраля 2019

Кажется, что это ограничение / ошибка при автоматизации 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.

...