AvalonEdit:获取语法突出显示的文本

时间:2014-02-04 16:47:12

标签: c# .net wpf syntax-highlighting avalonedit

我正在使用AvalonEdit注册语法高亮:

PythonPrompt.SyntaxHighlighting = pythonHighlighting; 

然后,用户可以在整个程序过程中输入文本。有没有办法获取格式化文本并将其移动到TextBlock而不会丢失格式?

由于此格式化文本不会再次被编辑,我认为创建TextBlock而不是动态创建TextEditor会更有效。

1 个答案:

答案 0 :(得分:0)

我设法得到了一些有用的东西。它基于AvalonEdit的最新代码(HighlightedLineRichTextModel

        TextBlock Item = new TextBlock();
        Code = Code.Replace("\t", new String(' ', Editor.Options.IndentationSize));

        TextDocument Document = new TextDocument(Code);
        IHighlightingDefinition HighlightDefinition = Editor.SyntaxHighlighting;
        IHighlighter Highlighter = new DocumentHighlighter(Document, HighlightDefinition.MainRuleSet);

        int LineCount = Document.LineCount;
        for (int LineNumber = 1; LineNumber <= Document.LineCount; LineNumber++)
        {
            HighlightedLine Line = Highlighter.HighlightLine(LineNumber);

            string LineText = Document.GetText(Line.DocumentLine);
            int Offset = Line.DocumentLine.Offset;

            int SectionCount = Line.Sections.Count;
            for (int SectionNumber = 0; SectionNumber < SectionCount; SectionNumber++)
            {
                HighlightedSection Section = Line.Sections[SectionNumber];

                //Deal with previous text
                if (Section.Offset > Offset)
                {
                    Item.Inlines.Add(
                        new Run(Document.GetText(Offset, Section.Offset - Offset))
                    );
                }

                Run RunItem = new Run(Document.GetText(Section));

                if (RunItem.Foreground != null)
                {
                    RunItem.Foreground = Section.Color.Foreground.GetBrush(null);
                }
                if (Section.Color.FontWeight != null)
                {
                    RunItem.FontWeight = Section.Color.FontWeight.Value;
                }

                Item.Inlines.Add(RunItem);

                Offset = Section.Offset + Section.Length;
            }

            //Deal with stuff at end of line
            int LineEnd = Line.DocumentLine.Offset + LineText.Length;
            if (LineEnd > Offset)
            {
                Item.Inlines.Add(
                    new Run(Document.GetText(Offset, LineEnd-Offset))
                );
            }

            //If not last line add a new line
            if (LineNumber < LineCount)
            {
                Item.Inlines.Add(new Run("\n"));
            }
        }