WPF 使用AvalonEdit实现代码编译器
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">[?,.;()\[\]{}+\-/%*<>^+~!|&]+</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实现代码编译器相关推荐
- WPF使用AvalonEdit实现代码高亮显示、搜索、替换功能
很多工程软件拥有自己定义的脚本语言,作为程序员用惯了具有高亮显示和智能提示功能的编辑器,所以针对特定的脚本自己开发一个编辑器.主要采用WPF.C#语言以及AvalonEdit控件. 文章目录 Avlo ...
- WPF 用 AvalonEdit 开发简单的代码编辑器 支持高亮自动提示
用 WPF 开发一个代码编辑器的难度很低,因为行业里面有很多小伙伴开发过,这些小伙伴将自己的代码开源了,发布到 NuGet 上,所以让我开发一个代码编辑器的难度实在太低.在不要有奇特的要求情况下,通过 ...
- Roadsend PHP-开源的PHP代码编译器
Roadsend PHP 是一个开源的php compiler, 可以将你的PHP代码编译成原生的二进制代码, 无需分发php源码. Roadsend 可以将你的PHP web项目编译成FastCGI ...
- java实现语法分析器_200 行 JS 代码,带你实现代码编译器
一.前言 对于前端同学来说,编译器可能适合神奇的魔盒 ,表面普通,但常常给我们惊喜. 编译器,顾名思义,用来编译,编译什么呢?当然是编译代码咯 . 其实我们也经常接触到编译器的使用场景: React ...
- 程序员最喜欢用的在线代码编译器,什么?你竟然不知道!可以在网页敲代码,运行调试!
程序员最喜欢用的在线IDE代码编译器,功能很强大,类别很全! 1.网址https://tech.io/snippet 支持 20+ 种编程语言,页面上没有杂七杂八的东西,非常简约,非常干净,另外,它上 ...
- 推荐几个好用的在线代码编译器
程序员最喜欢用的在线IDE代码编译器,功能很强大,类别很全! 1.网址https://tech.io/snippet 支持 20+ 种编程语言,页面上没有杂七杂八的东西,非常简约,非常干净,另外,它上 ...
- Vue(27)vue-codemirror实现在线代码编译器
前言 如果我们想在Web端实现在线代码编译的效果,那么需要使用组件vue-codemirror,他是将CodeMirror进行了再次封装 支持代码高亮 62种主题颜色,例如monokai等等 支持js ...
- 【Linux系统】开发工具(上) {软件包管理器yum,更新yum源,文本编辑器vim,vim的四种基本模式,vim指令集,代码编译器gcc/g++}
一.软件包管理器:yum 1.1 yum是什么? Linux下软件的安装方法: 源码安装:下载源码,在本地自行编译,然后才能安装. rpm安装:红帽软件包管理工具,属于安装包安装. yum安装:本身会 ...
- AvalonEdit C#代码折叠策略类
背景 AvalonEdit是一个基于WPF的开源.可扩展文本编辑器,用于代码的编辑显示,还可实现语法高亮.代码折叠.自动补全等功能,在需要显示或编辑代码的应用程序中确是一个不错的选择.然美中不足的是这 ...
最新文章
- JavaScript 定义类时如何将方法提取出来
- 《预训练周刊》第12期:无注意力变换器、借蛋白质语言模型论进化速度
- micropython是啥 知乎_micropython入门教程
- 在python中len表示的数据类型是_python基本数据类型学习
- outlook工具栏显示_Outlook 2007中的待办事项栏仅显示当前任务
- html作业本,小鹅通作业本使用教程
- 【fabric实战指南二】Fabric v1.0 部署过程原理详解
- CTF中一点进制转换脚本记录
- 怎么实现角色权限的分配_在 Go 语言中使用 casbin 实现基于角色的 HTTP 权限控制...
- 朴素贝叶斯解决凉鞋问题
- css内边距外边距和边框
- 齐岳定制EG/Li-BH4复合储氢材料/La2Mg17-Ni复合储氢材料/Mg-Nb/Mg-Nb2O5复合储氢粉体复合材料
- python写文件byte_python 将字节写入文本文件
- sql查询每科成绩的最高分_SQL查询每科分数最高的
- 56道java基础必“背“面试题(备战2022金三银四)
- 一头扎进Mysql视频教程 + 源码
- Airtest IDE 自动化测试15 - 如何让 Airtest 启动指定包名(start_app)
- 判断2064年是不是闰年。 		闰年判断规则: 		能被400整除的是闰年( 2000年是闰年) 		能被4整除,不能被100整除的是闰年(2004年是闰年) 		其他的不是闰年(1900年不是闰年)
- CSS----div或者view的圆角和方角
- Python基础之pyautogui模块(详细总结鼠标键盘操作)
热门文章
- java获取输入和运用scanner
- uniapp代码记录-保存图片到相册
- 基于Redis ZSet结构实现朋友圈点赞功能
- 集赞:免费领,飞利浦无线键鼠套装
- python 求 gamma 分布_用(python)Scipy拟合gamma分布
- 第一次前端实习所学内容
- Debian 9 stretch源设置,中文乱码解决
- FinOps,让云不再“钱”途无量
- 小浩漫画算法目录汇总(20200301版)
- 安装单机版hbase时出现的hostname: ssh: Could not resolve hostname hostname: Name or service not known问题解决方案之一