如何在运行时将关键字添加到主规则集?

时间:2014-04-23 13:16:55

标签: c# syntax-highlighting avalonedit

我在运行时向主规则集添加了一个新的关键字对象。但除了这些关键字,其他规则都是正确的。

有人能解释为什么在运行时加载的单词不会突出显示?

using (Stream stream = typeof(Window1).Assembly.GetManifestResourceStream("testAvalonEdit.MyLang.xshd")) {
    using (XmlReader reader = new XmlTextReader(stream)) {
        xshd = HighlightingLoader.LoadXshd(reader);
        customHighlighting = HighlightingLoader.Load(xshd, HighlightingManager.Instance);
        updateStandardParametersList();
    }
}
HighlightingManager.Instance.RegisterHighlighting("MyLang Highlighting", new string[ { ".s" }, customHighlighting);


其中,突出显示的方法是:

void updateStandardParametersList() {
    //find existing color. It exists for sure.
    XshdColor existingColor = xshd.Elements.OfType<XshdColor>().Where(xc => string.Equals(xc.Name, "StandardParametersColor", StringComparison.CurrentCultureIgnoreCase)).First();

    XshdKeywords newKeyWords = new XshdKeywords();
    newKeyWords.ColorReference = new XshdReference<XshdColor>(existingColor);

    //I add new words to the Keywords object
    for(int i = 1; i < 25; i++)
        newKeyWords.Words.Add("A000" + i.ToString("00"));
    for(int i = 1; i < 25; i++)
        newKeyWords.Words.Add("B000" + i.ToString("00"));
    for(int i = 1; i < 5; i++)
        newKeyWords.Words.Add("C0000" + i);

    XshdRuleSet mainRuleSet = xshd.Elements.OfType<XshdRuleSet>().Where(o => string.IsNullOrEmpty(o.Name)).First();
    mainRuleSet.Elements.Add(newKeyWords);
}

谢谢!


更新1

在尝试丹尼尔的建议后,

xshd = HighlightingLoader.LoadXshd(reader);
updateStandardParametersList();
customHighlighting = HighlightingLoader.Load(xshd, HighlightingManager.Instance);

我得到了这个例外:

enter image description here

那么,为什么抛出这个异常呢?我要做的就是添加Keywords对象并将其颜色设置为XSHD中的预定义颜色。

或者,这不是正确的方法吗?

1 个答案:

答案 0 :(得分:2)

来电HighlightingLoader.Load(xshd)根据IHighlightingDefinition对象中存储的信息创建xshd。如果您稍后更改xshdIHighlightingDefinition将无法了解这些更改。

要解决此问题,请在完成更新突出显示后调用HighlightingLoader.Load()

    xshd = HighlightingLoader.LoadXshd(reader);
    updateStandardParametersList();
    customHighlighting = HighlightingLoader.Load(xshd, HighlightingManager.Instance);

对于重复颜色异常:表达式new XshdReference<XshdColor>(existingColor)对应于在关键字元素上内联定义的XSHD颜色(它是颜色定义,而不仅仅是引用)。因此,您有多种颜色定义。

要创建对现有命名颜色的引用,请使用:

    newKeyWords.ColorReference = new XshdReference<XshdColor>(null, "StandardParametersColor");