WPF 使用AvalonEdit实现代码编译器

1.先在项目中NuGet安装一下AvalonEdit,如下图,选择第一项:

2.接着把下面的文件内容,保存为Lua.xshd文件名的文件(这个文件主要设置关键字显示的样式):

<?xml version="1.0"?>
<SyntaxDefinition name="SharpLua" extensions=".slua;.lua" xmlns="http://icsharpcode.net/sharpdevelop/syntaxdefinition/2008"><!-- The named colors 'Comment' and 'String' are used in SharpDevelop to detect if a line is inside a multiline string/comment --><Color name="Comment" foreground="#ff999999" exampleText="-- comment" /><Color name="String" foreground="#fff99157" /><Color name="Punctuation" /><Color name="MethodCall" foreground="#ffffcc66" fontWeight="bold"/><Color name="NumberLiteral" foreground="#ff99cc99"/><Color name="NilKeyword" fontWeight="bold"/><Color name="Keywords" fontWeight="bold" foreground="#ff6699cc" /><Color name="GotoKeywords" foreground="#ffcc99cc" /><Color name="Visibility" fontWeight="bold" foreground="#fff99157"/><Color name="TrueFalse" fontWeight="bold" foreground="#ff66cccc" /><RuleSet name="CommentMarkerSet"><Keywords fontWeight="bold" foreground="#fff2777a"><Word>TODO</Word><Word>FIXME</Word></Keywords><Keywords fontWeight="bold" foreground="#fff2777a"><Word>HACK</Word><Word>UNDONE</Word></Keywords></RuleSet><!-- This is the main ruleset. --><RuleSet><Span color="Comment"><Begin color="XmlDoc/DocComment">---</Begin><RuleSet><Import ruleSet="XmlDoc/DocCommentSet"/><Import ruleSet="CommentMarkerSet"/></RuleSet></Span><Span color="Comment" ruleSet="CommentMarkerSet" multiline="true"><Begin>--\[[=]*\[</Begin><End>\][=]*]</End></Span><Span color="Comment" ruleSet="CommentMarkerSet"><Begin>--</Begin></Span><Span color="String"><Begin>"</Begin><End>"</End><RuleSet><!-- span for escape sequences --><Span begin="\\" end="."/></RuleSet></Span><Span color="String"><Begin>'</Begin><End>'</End><RuleSet><!-- span for escape sequences --><Span begin="\\" end="."/></RuleSet></Span><Span color="String" multiline="true"><Begin color="String">\[[=]*\[</Begin><End>\][=]*]</End></Span><Keywords color="TrueFalse"><Word>true</Word><Word>false</Word></Keywords><Keywords color="Keywords"><Word>and</Word><Word>break</Word><Word>do</Word><Word>else</Word><Word>elseif</Word><Word>end</Word><Word>false</Word><Word>for</Word><Word>function</Word><Word>if</Word><Word>in</Word><Word>local</Word><!--<Word>nil</Word>--><Word>not</Word><Word>or</Word><Word>repeat</Word><Word>return</Word><Word>then</Word><Word>true</Word><Word>until</Word><Word>while</Word><Word>using</Word><Word>continue</Word></Keywords><Keywords color="GotoKeywords"><Word>break</Word><Word>return</Word></Keywords><Keywords color="Visibility"><Word>local</Word></Keywords><Keywords color="NilKeyword"><Word>nil</Word></Keywords><!-- Mark previous rule--><Rule color="MethodCall">\b[\d\w_]+  # an identifier(?=\s*\() # followed by (</Rule><Rule color="MethodCall">\b[\d\w_]+  # an identifier(?=\s*\") # followed by "</Rule><Rule color="MethodCall">\b[\d\w_]+  # an identifier(?=\s*\') # followed by '</Rule><Rule color="MethodCall">\b[\d\w_]+  # an identifier(?=\s*\{) # followed by {</Rule><Rule color="MethodCall">\b[\d\w_]+  # an identifier(?=\s*\[) # followed by [</Rule><!-- Digits --><Rule color="NumberLiteral">\b0[xX][0-9a-fA-F]+  # hex number|( \b\d+(\.[0-9]+)?   #number with optional floating point| \.[0-9]+           #or just starting with floating point)([eE][+-]?[0-9]+)? # optional exponent</Rule><Rule color="Punctuation">[?,.;()\[\]{}+\-/%*&lt;&gt;^+~!|&amp;]+</Rule></RuleSet>
</SyntaxDefinition>

把Lua.xshd放到解决方案资源管理器中,生成操作改为嵌入的资源

3.xaml里的代码如下:

<avalonEdit:TextEditorGrid.Row="2"xmlns:avalonEdit="http://icsharpcode.net/sharpdevelop/avalonedit"Name="textEditor"FontFamily="Consolas"FontSize="10pt"ShowLineNumbers="True"LostFocus="TextEditor_LostFocus"/>

然后在窗体的loaded事件中运行下面的代码即可:

//快速搜索功能
SearchPanel.Install(textEditor.TextArea);
//设置语法规则
string name = System.Reflection.Assembly.GetExecutingAssembly().GetName().Name + ".Lua.xshd";
System.Reflection.Assembly assembly = System.Reflection.Assembly.GetExecutingAssembly();
using (System.IO.Stream s = assembly.GetManifestResourceStream(name))
{using (XmlTextReader reader = new XmlTextReader(s)){var xshd = HighlightingLoader.LoadXshd(reader);textEditor.SyntaxHighlighting = HighlightingLoader.Load(xshd, HighlightingManager.Instance);}
}

如果需要加载需要的代码文件:

textEditor.Load(filename);

效果:

添加右键菜单(在窗体构造函数中添加如下即可):

ContextMenu aMenu = new ContextMenu();
MenuItem copyMenuItem = new MenuItem();
copyMenuItem.Header = "复制(C)";
copyMenuItem.Click += (sender, eventArgs) => rtb_TextArea.Copy();
aMenu.Items.Add(copyMenuItem);
MenuItem selectAllItem = new MenuItem();
selectAllItem.Header = "全选(A)";
selectAllItem.Click += (sender, eventArgs) => rtb_TextArea.SelectAll();
aMenu.Items.Add(selectAllItem);
rtb_TextArea.ContextMenu = aMenu;

扩展介绍:
或者我们也可以将语法显示的xshd配置文件的文件属性设置为不复制,生成操作设置为Resource;
然后使用绝对路径调用:

using (XmlTextReader xmlTextReader = new XmlTextReader(Application.GetResourceStream(new Uri("pack://application:,,,/WPF001;component/Files/Config.xshd")).Stream))
{rtb_ContentArea.SyntaxHighlighting = HighlightingLoader.Load(xmlTextReader, HighlightingManager.Instance);
}

备注:详细介绍
http://avalonedit.net/

WPF 使用AvalonEdit实现代码编译器相关推荐

  1. WPF使用AvalonEdit实现代码高亮显示、搜索、替换功能

    很多工程软件拥有自己定义的脚本语言,作为程序员用惯了具有高亮显示和智能提示功能的编辑器,所以针对特定的脚本自己开发一个编辑器.主要采用WPF.C#语言以及AvalonEdit控件. 文章目录 Avlo ...

  2. WPF 用 AvalonEdit 开发简单的代码编辑器 支持高亮自动提示

    用 WPF 开发一个代码编辑器的难度很低,因为行业里面有很多小伙伴开发过,这些小伙伴将自己的代码开源了,发布到 NuGet 上,所以让我开发一个代码编辑器的难度实在太低.在不要有奇特的要求情况下,通过 ...

  3. Roadsend PHP-开源的PHP代码编译器

    Roadsend PHP 是一个开源的php compiler, 可以将你的PHP代码编译成原生的二进制代码, 无需分发php源码. Roadsend 可以将你的PHP web项目编译成FastCGI ...

  4. java实现语法分析器_200 行 JS 代码,带你实现代码编译器

    一.前言 对于前端同学来说,编译器可能适合神奇的魔盒 ,表面普通,但常常给我们惊喜. 编译器,顾名思义,用来编译,编译什么呢?当然是编译代码咯 . 其实我们也经常接触到编译器的使用场景: React ...

  5. 程序员最喜欢用的在线代码编译器,什么?你竟然不知道!可以在网页敲代码,运行调试!

    程序员最喜欢用的在线IDE代码编译器,功能很强大,类别很全! 1.网址https://tech.io/snippet 支持 20+ 种编程语言,页面上没有杂七杂八的东西,非常简约,非常干净,另外,它上 ...

  6. 推荐几个好用的在线代码编译器

    程序员最喜欢用的在线IDE代码编译器,功能很强大,类别很全! 1.网址https://tech.io/snippet 支持 20+ 种编程语言,页面上没有杂七杂八的东西,非常简约,非常干净,另外,它上 ...

  7. Vue(27)vue-codemirror实现在线代码编译器

    前言 如果我们想在Web端实现在线代码编译的效果,那么需要使用组件vue-codemirror,他是将CodeMirror进行了再次封装 支持代码高亮 62种主题颜色,例如monokai等等 支持js ...

  8. 【Linux系统】开发工具(上) {软件包管理器yum,更新yum源,文本编辑器vim,vim的四种基本模式,vim指令集,代码编译器gcc/g++}

    一.软件包管理器:yum 1.1 yum是什么? Linux下软件的安装方法: 源码安装:下载源码,在本地自行编译,然后才能安装. rpm安装:红帽软件包管理工具,属于安装包安装. yum安装:本身会 ...

  9. AvalonEdit C#代码折叠策略类

    背景 AvalonEdit是一个基于WPF的开源.可扩展文本编辑器,用于代码的编辑显示,还可实现语法高亮.代码折叠.自动补全等功能,在需要显示或编辑代码的应用程序中确是一个不错的选择.然美中不足的是这 ...

最新文章

  1. JavaScript 定义类时如何将方法提取出来
  2. 《预训练周刊》第12期:无注意力变换器、借蛋白质语言模型论进化速度
  3. micropython是啥 知乎_micropython入门教程
  4. 在python中len表示的数据类型是_python基本数据类型学习
  5. outlook工具栏显示_Outlook 2007中的待办事项栏仅显示当前任务
  6. html作业本,小鹅通作业本使用教程
  7. 【fabric实战指南二】Fabric v1.0 部署过程原理详解
  8. CTF中一点进制转换脚本记录
  9. 怎么实现角色权限的分配_在 Go 语言中使用 casbin 实现基于角色的 HTTP 权限控制...
  10. 朴素贝叶斯解决凉鞋问题
  11. css内边距外边距和边框
  12. 齐岳定制EG/Li-BH4复合储氢材料/La2Mg17-Ni复合储氢材料/Mg-Nb/Mg-Nb2O5复合储氢粉体复合材料
  13. python写文件byte_python 将字节写入文本文件
  14. sql查询每科成绩的最高分_SQL查询每科分数最高的
  15. 56道java基础必“背“面试题(备战2022金三银四)
  16. 一头扎进Mysql视频教程 + 源码
  17. Airtest IDE 自动化测试15 - 如何让 Airtest 启动指定包名(start_app)
  18. 判断2064年是不是闰年。 闰年判断规则: 能被400整除的是闰年( 2000年是闰年) 能被4整除,不能被100整除的是闰年(2004年是闰年) 其他的不是闰年(1900年不是闰年)
  19. CSS----div或者view的圆角和方角
  20. Python基础之pyautogui模块(详细总结鼠标键盘操作)

热门文章

  1. java获取输入和运用scanner
  2. uniapp代码记录-保存图片到相册
  3. 基于Redis ZSet结构实现朋友圈点赞功能
  4. 集赞:免费领,飞利浦无线键鼠套装
  5. python 求 gamma 分布_用(python)Scipy拟合gamma分布
  6. 第一次前端实习所学内容
  7. Debian 9 stretch源设置,中文乱码解决
  8. FinOps,让云不再“钱”途无量
  9. 小浩漫画算法目录汇总(20200301版)
  10. 安装单机版hbase时出现的hostname: ssh: Could not resolve hostname hostname: Name or service not known问题解决方案之一