如何开发一个专业化的文本编辑器之Scintlla控件

Nuget搜索:scintilla,下载jacobslusser.ScintillaNET库即可,还有一个是移植到wpf平台的dll库estebano.ScintillaNET.WPF,wpf平台上需要下载此库


简介:它是一个winform开发的一个带有代码标注,代码提示,自动补全等等好用的功能的一个texteditor库,也是一个国外大神开发的软件库,此库git开源,git地址:https://github.com/jacobslusser/ScintillaNET  ,在此git中带上了控件库是的使用demo

那么怎么用呢?上代码,我是wpf平台上开发的,把一下代码复制到一个容器中就足以使用,所以需要一下使用方法:

 <WindowsFormsHost HorizontalAlignment="Left" VerticalAlignment="Top" Width="auto" Height="auto">          
  <edit:Scintilla x:Name="TextEditor" Dock="Fill" AutoSize="True" CursorChanged="TextEditor_OnCursorChanged" CaretLineVisible="True" TextChanged="Control_OnTextChanged" MarginClick="Scintilla_OnMarginClick" CharAdded="Scintilla_OnCharAdded">
</edit:Scintilla>
</WindowsFormsHost>

将上述的x:name中的名称保存下来,以供后台代码查找到该控件库。此处我使用了一个mvvm的插件,此处的代码在main.xmal.cs中:

 App.Locator.TextModal.InitPrograme(TextEditor);

有了此名称,设置该控件各种特性:这里的editor就是前面的TextEditor的名称,此处我用的是c++的代码提示风格,它内置了几十种语言的提示风格,所以可以直接使用它内置语言提示风格。它也提供了自定义代码提示,有点复杂就没有做,后面会补充上它的其他使用。

        private static string regexStr = "public void int double";

 //异步高亮,就是代码中不同类型的关键字可以显示不同颜色,
private void InitSyntaxColoring()
 {
            // Configuring the default style with properties
            // we have common to every lexer style saves time.
            Editor.StyleResetDefault();
            Editor.Styles[Style.Default].Font = "Consolas";
            Editor.Styles[Style.Default].Size = 10;
            Editor.StyleClearAll();

            // Configure the CPP (C#) lexer styles
            Editor.Styles[Style.Cpp.Default].ForeColor = Color.Black;
            Editor.Styles[Style.Cpp.Comment].ForeColor = System.Drawing.Color.Green;
            Editor.Styles[Style.Cpp.CommentLine].ForeColor = System.Drawing.Color.Green;
            Editor.Styles[Style.Cpp.CommentLineDoc].ForeColor = Color.FromArgb(128, 128, 128); // Gray
            Editor.Styles[Style.Cpp.Number].ForeColor = System.Drawing.Color.Purple;
            Editor.Styles[Style.Cpp.Word].ForeColor = System.Drawing.Color.Orange;
            Editor.Styles[Style.Cpp.String].ForeColor = Color.FromArgb(163, 21, 21); // Red
            //Editor.Styles[Style.Cpp.Character].ForeColor = Color.FromArgb(163, 21, 21); // Red
           // Editor.Styles[Style.Cpp.Verbatim].ForeColor = Color.FromArgb(163, 21, 21); // Red
            Editor.Styles[Style.Cpp.StringEol].BackColor = System.Drawing.Color.Red;
            Editor.Styles[Style.Cpp.Operator].ForeColor = Color.Purple;
         //   Editor.Styles[Style.Cpp.Preprocessor].ForeColor = Color.Maroon;
            Editor.Lexer = Lexer.Cpp;

            // Set the keywords
            Editor.SetKeywords(0, $"{regexStr}");
}

显示行号:

public void ShowLineNumber()
{
            // Did the number of characters in the line number display change?
            // i.e. nnn VS nn, or nnnn VS nn, etc...
            var length = Editor.Lines.Count.ToString().Length;
            if (this._maxLineNumberCharLength == length)
                return;

            // Calculate the width required to display the last line number
            // and include some padding for good measure.
            const int padding = 25;
            Editor.Margins[0].Width = Editor.TextWidth(ScintillaNET.Style.LineNumber, new string('9', _maxLineNumberCharLength + 1)) + padding;
            this._maxLineNumberCharLength = length;
}

一下是其他功能,都在main.xaml.cs中, 

    public partial class TextEditorTemplate : UserControl
    {
        private static string regexStr = "mipi lr dsc dsi power down pwm driver video write power on reset gpio ms s us delay pll lane timing enable disable colorbar nonburstevents interface dualmode order rgb bgr ch show image color";
        public TextEditorTemplate()
        {
            InitializeComponent();
            //App.Locator.TextModal.Editor = TextEditor;
            App.Locator.TextModal.InitPrograme(TextEditor);
        }

        private CustomLexer cSharpLexer = new CustomLexer(regexStr);

        /// <summary>
        /// 自定义高亮
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void scintilla_StyleNeeded(object sender, StyleNeededEventArgs e)
        {
           // var startPos = TextEditor.GetEndStyled();
           // var endPos = e.Position;
            App.Locator.Main.AddLogMsg($"{startPos++},{endPos}");
           // cSharpLexer.Style(TextEditor, startPos, endPos);
        }
        /// <summary>
        /// 行号
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void Control_OnTextChanged(object sender, EventArgs e)
        {
             App.Locator.TextModal.ShowLineNumber();
        }
        /// <summary>
        /// 断点
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void Scintilla_OnMarginClick(object sender, MarginClickEventArgs e)
        {
            if (e.Margin == TextEitorModal.BOOKMARK_MARGIN)
            {
                // Do we have a marker for this line?
                uint mask = (uint)(1 << TextEitorModal.BOOKMARK_MARKER);
                var line = TextEditor.Lines[TextEditor.LineFromPosition(e.Position)];
                if ((line.MarkerGet() & mask) > 0)
                {
                    // Remove existing bookmark
                    line.MarkerDelete(TextEitorModal.BOOKMARK_MARKER);
                }
                else
                {
                    // Add bookmark
                    line.MarkerAdd(TextEitorModal.BOOKMARK_MARKER);
                    
                }
            }
        }
        /// <summary>
        /// 自动完成
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void Scintilla_OnCharAdded(object sender, CharAddedEventArgs e)
        {
            var currentPos = TextEditor.CurrentPosition;
            var wordStartPos = TextEditor.WordStartPosition(currentPos, true);

            // Display the autocompletion list
            var lenEntered = currentPos - wordStartPos;
            if (lenEntered > 0)
            {
                if (!TextEditor.AutoCActive)
                    TextEditor.AutoCShow(lenEntered, regexStr);
            }
        }

        private void TextEditor_OnCursorChanged(object sender, EventArgs e)
        {
            var typ = sender;
        }

        private void TextEditorTemplate_OnSizeChanged(object sender, SizeChangedEventArgs e)
        {
            var size = e.NewSize;
            TextEditor.Width = (int) size.Width;
            TextEditor.Height = (int) size.Height;
        }
    }

最后效果如图:

sci效果图
最后的效果图

如有问题请联系邮箱,940747003@qq.com

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

cathedra

谢谢老板的飞机,老板大气!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值