Joe*_*ite 22 syntax-highlighting avalonedit
我正在尝试为AvalonEdit定义一些自定义突出显示规则.似乎没有任何相关的文档 - 有关于文件格式的一些文档,但没有关于如何在创建它之后实际加载和使用该定义的文档.
" 语法高亮 "维基页面(对于旧的WinForms TextEditor)记录了如何从磁盘上的.xshd文件加载突出显示定义,但我宁愿将其作为资源嵌入,就像AvalonEdit对其内置定义一样.
我查看了加载其内置荧光笔的ICSharpCode.AvalonEdit项目中的代码,但实际的"资源加载"代码是在DefaultHighlightingManager.LoadHighlighting中完成的,这是私有的 - 为了使事情变得怪异,显然只在发布版本中调用.
我可以不停地摸索,从私有方法中复制/粘贴一些代码,并尝试将可能或可能不起作用的东西拼凑在一起,但似乎值得问一下:这样做的标准方法是什么?是否有推荐的方法让第三方代码从资源加载突出显示定义?
Daniel的回答给了我一个良好的开端,但你需要在传递给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);
}
Run Code Online (Sandbox Code Playgroud)
然后我就可以打电话了ResourceLoader.LoadHighlightingDefinition("Name.xshd").
对于在家中跟随的任何人,.xshd文件需要将其Build Action设置为Embedded Resource.
Dan*_*iel 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);
}
}
Run Code Online (Sandbox Code Playgroud)
AvalonEdit本身的加载代码很奇怪,因为它急切地在调试版本中加载xshds(以便立即注意到它们中的错误),但是在发布版本中延迟加载它们.
我个人更喜欢 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));
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
XAML
<avalon:TextEditor SyntaxHighlighting="SQL"/>
Run Code Online (Sandbox Code Playgroud)
值得的是,如果您使用的是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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
11121 次 |
| 最近记录: |