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效果图](https://i-blog.csdnimg.cn/blog_migrate/67bb8b5090c2509cb4bfe391f28e5cea.png)
如有问题请联系邮箱,940747003@qq.com