首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >以编程方式向AvalonEdit添加语法突出显示规则

以编程方式向AvalonEdit添加语法突出显示规则
EN

Stack Overflow用户
提问于 2012-08-04 15:24:43
回答 2查看 3.8K关注 0票数 7

我在一个应用程序中使用AvalonEdit,它运行我自己定制的语言。我想在Avalon Edit中加入适当的语法突出显示。通常,这是通过在xml文件中手动定义突出显示规则来完成的。

但是,我不希望每当我扩展语言时,突出显示规则总是与语言语法脱节。所以我希望使用我的coco/R解析器中已经包含的语法信息来自动生成这些规则。那么,有没有办法以编程方式将语法突出显示规则添加到Avalon Edit中?

谢谢

EN

回答 2

Stack Overflow用户

发布于 2012-10-08 17:15:31

下面的代码至少对我来说是有效的。

代码语言:javascript
复制
Assembly assembly = Assembly.GetExecutingAssembly();
using (Stream s = assembly.GetManifestResourceStream("Your.xshd"))
{
    using (XmlTextReader reader = new XmlTextReader(s))
    {
        //Load default Syntax Highlighting
        InternalEditor.SyntaxHighlighting = HighlightingLoader.Load(reader, HighlightingManager.Instance);

        // Dynamic syntax highlighting for your own purpose
        var rules = InternalEditor.SyntaxHighlighting.MainRuleSet.Rules;

        _HighlightingRule = new HighlightingRule();
        _HighlightingRule.Color = new HighlightingColor()
        {
                Foreground = new CustomizedBrush(SomeColor)
        };

        String[] wordList = PseudoGetKeywords(); // Your own logic
        String regex = String.Format(@"\b({0})\w*\b", String.Join("|", wordList));
        _HighlightingRule.Regex = new Regex(regex);

        rules.Add(_HighlightingRule);
    }
}


internal sealed class CustomizedBrush : HighlightingBrush
{
    private readonly SolidColorBrush brush; 
    public CustomizedBrush(Color color)
    {
        brush = CreateFrozenBrush(color);
    }

    public CustomizedBrush(System.Drawing.Color c)
    {
        var c2 = System.Windows.Media.Color.FromArgb(c.A, c.R, c.G, c.B);        
        brush = CreateFrozenBrush(c2);
    }

    public override Brush GetBrush(ITextRunConstructionContext context)
    {
        return brush;
    }

    public override string ToString()
    {
        return brush.ToString();
    }

    private static SolidColorBrush CreateFrozenBrush(Color color)
    {
        SolidColorBrush brush = new SolidColorBrush(color);
        brush.Freeze();
        return brush;
    }
}
票数 7
EN

Stack Overflow用户

发布于 2012-08-09 06:08:15

您可以使用ICSharpCode.AvalonEdit.Highlighting.Xshd (XshdSyntaxDefinition等)中的对象模型在内存中生成.xshd文件。

要将其转换为IHighlightingDefinition,请使用HighlightingLoader.Load()方法。您还可以通过应用SaveXshdVisitor将其保存到磁盘(用于调试目的)。

或者,您可以自己实现IHighlightingDefinition并直接创建HighlightingRuleSet实例。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11806764

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档