我在运行时向主规则集添加了一个新的关键字对象。但除了这些关键字,其他规则都是正确的。
有人能解释为什么在运行时加载的单词不会突出显示?
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);
}
谢谢!
在尝试丹尼尔的建议后,
xshd = HighlightingLoader.LoadXshd(reader);
updateStandardParametersList();
customHighlighting = HighlightingLoader.Load(xshd, HighlightingManager.Instance);
我得到了这个例外:
那么,为什么抛出这个异常呢?我要做的就是添加Keywords
对象并将其颜色设置为XSHD中的预定义颜色。
或者,这不是正确的方法吗?
答案 0 :(得分:2)
来电HighlightingLoader.Load(xshd)
根据IHighlightingDefinition
对象中存储的信息创建xshd
。如果您稍后更改xshd
,IHighlightingDefinition
将无法了解这些更改。
要解决此问题,请在完成更新突出显示后调用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");