使用AvalonEdit实现WPF的Lua编辑器

发布时间:2025-12-09 12:03:05 浏览次数:1

原文发布于:https://www.chenxublog.com/2019/07/14/use-avalonedit-make-wpf-lua-editor.html

由于LLCOM里面内置了Lua代码的编辑器,所以我就使用了AvalonEdit这个轮子,不过一开始的Lua语言支持让我一顿好找

不过好在找到了网上的资料,我就把整个实现过程贴在下面

准备

先去nuget安装一下AvalonEdit,以备后面使用:

接着把下面的文件内容,保存为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放到解决方案资源管理器中,生成操作改为嵌入的资源:

使用

xaml里的代码如下:

<avalonEdit:TextEditor Grid.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);    }}

效果

效果什么的。。。自己去下载一个LLCOM看看就知道了嘛:

avalonedit
需要做网站?需要网络推广?欢迎咨询客户经理 13272073477