我正在尝试为AvalonEdit定义一些自定义突出显示规则。似乎没有任何关于此的文档 - 有some documentation on the file format,但没有关于如何在创建后实际加载和使用该定义。
“Syntax highlighting”wiki页面(对于旧的WinForms TextEditor)记录了如何从磁盘上的.xshd文件加载突出显示定义,但我宁愿将其作为资源嵌入,就像AvalonEdit一样。内置定义。
我查看了加载其内置荧光笔的ICSharpCode.AvalonEdit项目中的代码,但实际的“资源加载”代码是在DefaultHighlightingManager.LoadHighlighting中完成的,这是私有的 - 并且要制作weirder,显然只在发布版本中调用。
我可以不停地摸索,从私有方法中复制/粘贴一些代码,并尝试将可能或可能不起作用的东西拼凑在一起,但似乎值得问一下:标准的方法是什么?这样做?第三方代码是否建议从资源加载突出显示定义?
Daniel's answer给了我一个良好的开端,但是你需要在传递给GetManifestResourceStream的字符串中包含命名空间名称 - 如果不这样做,你将得到一个NullReferenceException(因为它返回一个空流) )。
我最后将一个名为ResourceLoader的静态类添加到与.xshd文件相同的项目文件夹中,使用此方法:
public static IHighlightingDefinition LoadHighlightingDefinition(
string resourceName)
{
var type = typeof(ResourceLoader);
var fullName = type.Namespace + "." + resourceName;
using (var stream = type.Assembly.GetManifestResourceStream(fullName))
using (var reader = new XmlTextReader(stream))
return HighlightingLoader.Load(reader, HighlightingManager.Instance);
}
然后我可以致电ResourceLoader.LoadHighlightingDefinition("Name.xshd")
。
对于在家中关注的任何人,.xshd文件需要将其Build Action设置为Embedded Resource。
答案 0 :(得分:27)
您可以使用类ICSharpCode.AvalonEdit.Highlighting.Xshd.HighlightingLoader
中的静态方法来加载.xshd文件。
例如:
using (Stream s = myAssembly.GetManifestResourceStream("MyHighlighting.xshd")) {
using (XmlTextReader reader = new XmlTextReader(s)) {
textEditor.SyntaxHighlighting = HighlightingLoader.Load(reader, HighlightingManager.Instance);
}
}
AvalonEdit本身的加载代码很奇怪,因为它急切地在调试版本中加载xshds(以便立即注意到它们中的错误),但是在发布版本中延迟加载它们。
答案 1 :(得分:4)
对于它的价值,如果你使用F#,这是一个用于注册xshd文件的代码片段。
let registerHighlighting() =
try
// Load our custom highlighting definition
match System.Reflection.Assembly.GetExecutingAssembly().GetManifestResourceStream("GSLhighlighting.xshd") with
| null -> failwithf "ERROR: could not find embedded resource"
| s ->
use reader = new XmlTextReader(s)
let gslHighlighting = ICSharpCode.AvalonEdit.Highlighting.Xshd.HighlightingLoader.Load(reader, HighlightingManager.Instance)
// and register it in the HighlightingManager
HighlightingManager.Instance.RegisterHighlighting("GSL", [| ".gsl" |], gslHighlighting)
editor.SyntaxHighlighting <- gslHighlighting
with _ as exn ->
printfn "ERROR: %s" exn.Message
答案 2 :(得分:4)
我个人更喜欢Darren使用RegisterHighlighting
注册突出显示定义的方式,然后您可以像在其他内置定义中一样在XAML中使用它。
<强> C#强>
public partial class App : Application
{
public App()
{
using (var stream = new System.IO.MemoryStream(WpfApp15.Properties.Resources.sql))
{
using (var reader = new System.Xml.XmlTextReader(stream))
{
ICSharpCode.AvalonEdit.Highlighting.HighlightingManager.Instance.RegisterHighlighting("SQL", new string[0],
ICSharpCode.AvalonEdit.Highlighting.Xshd.HighlightingLoader.Load(reader,
ICSharpCode.AvalonEdit.Highlighting.HighlightingManager.Instance));
}
}
}
}
<强> XAML 强>
<avalon:TextEditor SyntaxHighlighting="SQL"/>
答案 3 :(得分:3)
当我使用GetManifestResourceStream获取xshd文件时,我得到了null。 我改为使用StreamReader:
using (StreamReader s =
new StreamReader(@"C:\Users\Smadar.Tsdaka\Documents\ServoStudio\Scripts\ServoStudioSyntax.xshd"))
{
using (XmlTextReader reader = new XmlTextReader(s))
{
scriptBody.SyntaxHighlighting =
ICSharpCode.AvalonEdit.Highlighting.Xshd.HighlightingLoader.Load(
reader,
HighlightingManager.Instance);
}
}
答案 4 :(得分:0)
创建一个资源字符串并将其命名为“ xshd”,然后在内容中输入所需内容。 接下来使用以下简单代码:
XmlReader xshdres = XmlReader.Create(new MemoryStream(Encoding.Unicode.GetBytes(Properties.Resources.xshd)));
textEditor.SyntaxHighlighting = HighlightingLoader.Load(xshdres, HighlightingManager.Instance);
textEditor
是XAML中avalonedit文本编辑器的名称。