扩展 ICSharpCode.TextEditor 语法高亮方案






4.29/5 (5投票s)
如何使用 ICSharpCode.TextEditor,一个免费、易于使用、可扩展且高质量的 .NET 程序语法高亮控件。
引言
本文讨论了如何为 .NET 程序选择免费、易于使用、可扩展且高质量的语法高亮控件?
Scintilla
首先,我尝试使用 ScintillaNet,但没有成功在测试程序中使用它。 它需要在使用前进行设置,需要非托管的伴随库,这使得它难以用于多平台。 毕竟,将 ScintillaNet 控件添加到工具箱后,我发现我的 Visual Studio C# 2010 Express 非常不稳定。 经过多次试验,我成功地让它运行起来,但结果似乎不稳定且不可重复。 我个人不建议在 .NET 应用程序中使用 Scintilla,但它可能是 C++ 项目的一个不错的选择。
ICSharpCode.TextEditor
搜索后,我从一个著名的开源 IDE SharpDevelop 中找到了编辑器控件。 语法高亮文本编辑器控件在 Scintilla 之后看起来非常好且轻量级。 它需要更少的加载时间,并且似乎更稳定。 您可以在 SharpDevelop 下载页面上找到源代码和二进制文件。
使其工作
首先,您需要做的是向项目添加程序集引用。 接下来,您选择 Visual Studio 工具箱的程序集和控件。 之后,您可以将控件放到窗体上。 令人惊讶的是,您不会看到选择语法高亮方案的属性。 相反,您必须使用方法 SetHighlighting
。 String
参数从可用方案列表中设置高亮方案。 这些方案嵌入在控件中。
许可问题
ICSharpCode.TextEditor
在 LGPL 许可下可用,这意味着如果您没有对许可组件进行自己的修改,您可以在开源或商业应用程序中免费使用此软件组件。 但是,如果您修改了源代码,则必须根据许可规则提供修改后的源代码以供公众访问。
添加新的高亮方案
如果嵌入的方案列表不足以满足您的应用程序怎么办? 您可以使用文件添加自己的,如 SharpDevelop Wiki 上的文章中所述。 但是,如果您不喜欢浪费磁盘空间和使用多个文件,或者无法在应用程序中使用外部文件怎么办? 如果您根据 LGPL 的规则将新方案添加到控件的程序集中,则必须提供修改后的控件的源代码。 这可能会为专有软件中的分发带来问题。
嵌入高亮方案
我们需要什么才能将方案嵌入到应用程序中? 您必须实现您自己的方案提供程序。 如果您查看原始资源方案提供程序的源代码,这非常容易。 我们将其用作示例。 向应用程序添加一个新类
public class AppSyntaxModeProvider : ISyntaxModeFileProvider
{
List<syntaxmode> syntaxModes = null;
public ICollection<syntaxmode> SyntaxModes {
get {
return syntaxModes;
}
}
public AppSyntaxModeProvider()
{
Assembly assembly = Assembly.GetExecutingAssembly();
//enumerate resource names if need
//foreach (string resourceName in assembly.GetManifestResourceNames()){}
//load modes list
Stream syntaxModeStream = assembly.GetManifestResourceStream(
"WindowsFormsApplication1.Resources.SyntaxModes.xml");
if (syntaxModeStream != null) {
syntaxModes = SyntaxMode.GetSyntaxModes(syntaxModeStream);
} else {
syntaxModes = new List<syntaxmode>();
}
}
public XmlTextReader GetSyntaxModeFile(SyntaxMode syntaxMode)
{
Assembly assembly = Assembly.GetExecutingAssembly();
// load syntax schema
Stream stream = assembly.GetManifestResourceStream(
"WindowsFormsApplication1.Resources." + syntaxMode.FileName);
return new XmlTextReader(stream);
}
public void UpdateSyntaxModeList()
{
// resources don't change during runtime
}
}
将方案文件添加到嵌入的资源
当我们完成提供程序后,我们可以将方案文件嵌入到应用程序中。 我们至少需要两个文件:SyntaxModes.xml 和方案文件,例如,如果我们提供 SQL 语法模式,则需要SQL-Mode.xshd 。 我向项目中添加了一个名为Resources的新文件夹,添加文件并在“属性”中选择“生成操作 - 嵌入的资源”。
SyntaxModes.xml 文件应包含所有添加的方案描述,在我们的示例中只有一个
<syntaxmodes version="1.0">
<mode extensions=".sql" file="SQL-Mode.xshd" name="SQL">
</mode></syntaxmodes>
我从 Paul Kohler 的 MiniSqlQuery 中获取了包含 SQL 方案的文件,该文件根据 Microsoft 公共许可证的条款发布 (http://pksoftware.net/MiniSqlQuery/)。
请注意为嵌入的文件提供嵌入资源的正确名称。 通常它是[assembly.namespace].[folder].[file.name]。
整合
本文的示例包含一个良好的实验基础。 我添加了属性编辑器来使用编辑器控件的属性。 示例应用程序可用于研究 ICSharpCode.TextEditor
的功能。
设置高亮方案时,请记住该名称区分大小写,并且应与方案文件中描述的名称完全匹配。