65.9K
CodeProject 正在变化。 阅读更多。
Home

扩展 ICSharpCode.TextEditor 语法高亮方案

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.29/5 (5投票s)

2010年9月22日

CPOL

3分钟阅读

viewsIcon

41275

如何使用 ICSharpCode.TextEditor,一个免费、易于使用、可扩展且高质量的 .NET 程序语法高亮控件。

引言

本文讨论了如何为 .NET 程序选择免费、易于使用、可扩展且高质量的语法高亮控件?

Scintilla

首先,我尝试使用 ScintillaNet,但没有成功在测试程序中使用它。 它需要在使用前进行设置,需要非托管的伴随库,这使得它难以用于多平台。 毕竟,将 ScintillaNet 控件添加到工具箱后,我发现我的 Visual Studio C# 2010 Express 非常不稳定。 经过多次试验,我成功地让它运行起来,但结果似乎不稳定且不可重复。 我个人不建议在 .NET 应用程序中使用 Scintilla,但它可能是 C++ 项目的一个不错的选择。

ICSharpCode.TextEditor

搜索后,我从一个著名的开源 IDE SharpDevelop 中找到了编辑器控件。 语法高亮文本编辑器控件在 Scintilla 之后看起来非常好且轻量级。 它需要更少的加载时间,并且似乎更稳定。 您可以在 SharpDevelop 下载页面上找到源代码和二进制文件。

使其工作

首先,您需要做的是向项目添加程序集引用。 接下来,您选择 Visual Studio 工具箱的程序集和控件。 之后,您可以将控件放到窗体上。 令人惊讶的是,您不会看到选择语法高亮方案的属性。 相反,您必须使用方法 SetHighlightingString 参数从可用方案列表中设置高亮方案。 这些方案嵌入在控件中。

许可问题

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 的功能。

设置高亮方案时,请记住该名称区分大小写,并且应与方案文件中描述的名称完全匹配。

链接和鸣谢

© . All rights reserved.