OpenXML Paragraph.InsertAfter Недопустимая операция - PullRequest
0 голосов
/ 26 марта 2019

Попытка выделить и скрыть некоторый текст с помощью OpenXML SDK и обнаружила здесь функцию для этого, однако выдает ошибку «Недопустимая операция» при попытке сделать это с текстом в PictureBox-Textbox.Смотрите код ниже.Я определил, что это текстовое поле как проблема, потому что оно работает со всем остальным.

    static void HighLightText(Paragraph paragraph, string text)
    {
        // Search for a first occurrence of the text in the text runs
        var found = paragraph
            .Descendants<Run>()
            .Where(r => !string.IsNullOrEmpty(r.InnerText) && r.InnerText != "\\s" && r.GetFirstChild<Text>() != null)
            .Select(r =>
            {
                var runText = r.GetFirstChild<Text>();
                int index = runText.Text.IndexOf(text, StringComparison.OrdinalIgnoreCase);

        // 'Run' is a reference to the text run we found,
        // TextNode is a reference to the run's Text object,
        // 'TokenIndex` is the index of the search string in run's text
        return new { Run = r, TextNode = runText, TokenIndex = index };
            })
            .FirstOrDefault(o => o.TokenIndex >= 0);

        // Nothing found -- escape
        if (found == null || found.Run == null)
        {
            return;
        }

        // Create a node for highlighted text as a clone (to preserve formatting etc)
        var highlightRun = found.Run.CloneNode(true);

        // Add the highlight node after the found text run and set up the highlighting
        paragraph.InsertAfter(highlightRun, found.Run);
        highlightRun.GetFirstChild<Text>().Text = text;
        RunProperties runPro = new RunProperties();
        Highlight highlight = new Highlight { Val = HighlightColorValues.Yellow };
        Vanish vv = new Vanish();

        runPro.AppendChild(highlight);
        runPro.AppendChild(vv);
        highlightRun.InsertAt(runPro, 0);

        // Check if there's some text in the text run *after* the found text
        int remainderLength = found.TextNode.Text.Length - found.TokenIndex - text.Length;
        if (remainderLength > 0)
        {
            // There is some text after the highlighted section --
            // insert it in a separate text run after the highlighted text run
            var remainderRun = found.Run.CloneNode(true);
            paragraph.InsertAfter(remainderRun, highlightRun);
            var textNode = remainderRun.GetFirstChild<Text>();
            textNode.Text = found.TextNode.Text.Substring(found.TokenIndex + text.Length);

            // We need to set up this to preserve the spaces between text runs
            textNode.Space = new EnumValue<SpaceProcessingModeValues>(SpaceProcessingModeValues.Preserve);
        }

        // Check if there's some text *before* the found text
        if (found.TokenIndex > 0)
        {
            // Something is left before the highlighted text,
            // so make the original text run contain only that portion
            found.TextNode.Text = found.TextNode.Text.Remove(found.TokenIndex);

            // We need to set up this to preserve the spaces between text runs
            found.TextNode.Space = new EnumValue<SpaceProcessingModeValues>(SpaceProcessingModeValues.Preserve);
        }
        else
        {
            // There's nothing before the highlighted text -- remove the unneeded text run
            paragraph.RemoveChild(found.Run);
        }
    }
...