选用示例,山寨个代码编辑器

NanUI for
Winform从昨日写博客公布到后日赚取了和多朋友的关心,首先谢谢我们的青眼和帮忙!请看前天本身的博文《NanUI
for
Winform发布,让Winform分界面设计有所Infiniti只怕
》。

【请留心:此文已过期,0.6版NanUI完结情势各异!!!】

有心上人问到作者是或不是思索开源NanUI,作者想应对是早晚的。可是近期来看NanUI内部还有局地难题并从未拿走缓和,因此目前不会绽放源代码。待那个主题材料顺利化解未来小编会第目前间把NanUI的源码放到GitHub,请稍等片刻。

 

那正是说,从前天起笔者会6续释放部分NanUI使用的片段小示例和源代码供感兴趣的心上海腴考把玩。任何关于NanUI的题目招待我们进群(群号:二4十8825陆)或留言与小编交换。

NanUI for
Winform从明天写博客宣布到今后收获了和多朋友的爱戴,首先谢谢大家的关爱和支撑!请看前几天本人的博文《NanUI
for
Winform发表,让Winform分界面设计具备极其大概
》。

上边,开始前几天的演示

有心上人问到笔者是否怀念开源NanUI,作者想应对是早晚的。不过当前来看NanUI内部还有一部分标题并不曾拿走缓和,由此权且不会盛开源代码。待这么些主题素材顺遂化解现在作者会第一时间把NanUI的源码放到GitHub,请稍等片刻。

NanUI for Winform 使用示例【第1集】

那么,从后天起笔者会6续释放部分NanUI使用的局地小示例和源代码供感兴趣的意中人葠考把玩。任何有关NanUI的题目接待我们进群(群号:24108825陆)或留言与本人沟通。

山寨个代码编辑器

图片 1

2018年微软破天荒的布告了个吊炸天的开源代码编辑器VS Code,观察VS
Code的目录结构可见,其实它也是依赖CEF来进行开辟的,使用的是名称为electron的框架。那么,下边笔者将用NanUI山寨三个简短的Code编辑器实现对代码文件的新建、张开和保留操作,取名称为NanUI代码编辑器。

NanUI代码编辑器使用的大旨才具有:

  • Bootstrap
  • CodeMirror
  • NanUI for Winform(笔者晓得,那句话是废话)
  • 从离其他能源程序集加载财富

Bootstrap做响应式的页面吊炸天,纵然大家后天要开始展览的小示例用不到响应式布局,不过引用进来就当CSS
Clear用啊。其它二个CodeMirror作为网页端最庞大的代码编辑器,此次经过NanUI,大家的Winform也将分享它带动的有力功效。上面,笔者将分步疏解如何来山寨这几个代码编辑器。

在VS中新建Windows
Application项目(前面称为主项目),然后在品种->属性->调节和测试中关闭“运行VS承载进度”选项,因为通超过实际行,开启该选拔后不能加载嵌入的网页财富。同时,开启“启用本机代码调节和测试选项”,因为ChromiumFX使用了PInvoke的法门调用,会有繁多不叁不四的非托管错误,举个例子,笔者事先就遇上个例如开动项目就报错的标题,开启了本机代码调节和测试后意识是QQ拼音输入法钩子的难点,点个忽略继续就能够正常调节和测试了。设置好后引用NanUI的库NetDimenison.NanUI.dll

图片 2

 

再新建七个类库项目(前边称为财富类型),在中间建立文件夹www,文件夹名字未有须要,随便就好,但要重申一点,html文件不能在类库项目的根目录下,必须建立个文件夹来放置网页文书档案。将bootstrap和codemirror的html、css和js文件等拷贝进www目录,当然你也足以平素从nuget上下载它们,只是要求把nuget得到的公文都拖到www里面,形成上边包车型客车公文结构。

图片 3

删除掉用不着的文本,从品类中排除或直接删除都行,剩下的内需用的项目都在性质窗口中把转换操作改成“嵌入的财富”。然后新建个静态类,名字随意取,里面新建个法子来暴光能源类型的Assembly。

namespace NanUI.Demo.CodeEditor.Resources
{
    public static class SchemeHelper
    {
        public static System.Reflection.Assembly GetSchemeAssembley()
        {
            return System.Reflection.Assembly.GetExecutingAssembly();
        }
    }
}

新建这些类的效益是方便主项目登记能源类型里面包车型地铁程序集,要是用那种办法来注册资源文件须要在主项目中引用财富类型。其它1个方式,能够一贯在主项目中央直机关接使用Assembly.LoadFile加载财富类型,借使项目需求日常更新的话用这么些主意能够实现时时更新能源文件而不用重新安装整个软件,具体的用法会在以后的言传身教中介绍,在此就不多说了。

诸如此类,能源类型就弄好了。接下来的干活都就要主项目上进展了。在主项目标main函数里伊始化NanUI。

namespace NanUI.Demo.CodeEditor
{
    using NetDimension.NanUI;

    static class Program
    {
        /// <summary>
        /// 应用程序的主入口点。
        /// </summary>
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            UIStartupManager.UseSharedFramework = true;
            if (UIStartupManager.InitializeChromium())
            {
                //初始化成功,加载程序集内嵌的资源到运行时中
                UIStartupManager.RegisterEmbeddedScheme(Resources.SchemeHelper.GetSchemeAssembley());



                //启动主窗体
                Application.Run(new EditorForm());
            }


        }
    }
}

里头,Resources.SchemeHelper.GetSchemeAssembley()方法就是从财富类型里面把Assembly加载过来。之后新建编辑器的主窗体艾德itorForm。艾德itorForm除了轻易的装置外,需别的增添多少个主意来决定文件的新建、打开、保存等操作。

namespace NanUI.Demo.CodeEditor
{
    using NetDimension.NanUI;

    public partial class EditorForm : HtmlUIForm
    {

        internal bool isClean = true;
        internal bool isNew = true;

        internal string currentFilePath = string.Empty;


        public EditorForm()
            : base("embedded://www/main.html")
        {
            InitializeComponent();

            UI.GlobalObject.Add("hostEditor", new JsCodeEditorObject(this));
        }

        void SetEditorMode()
        {
            if (!string.IsNullOrEmpty(currentFilePath))
            {
                var fileInfo = new System.IO.FileInfo(currentFilePath);

                var ext = fileInfo.Extension;

                if (ext.IndexOf('.') == 0)
                {
                    ext = ext.Substring(1);
                    UI.ExecuteJavascript($"CodeEditor.changeCodeScheme('{ext}');");
                }
            }
        }

        //设置编辑器标题逻辑
        void SetEditorTitle()
        {
            if (isNew || string.IsNullOrEmpty(currentFilePath))
            {
                UI.ExecuteJavascript($"CodeEditor.setTitle('新建');");
            }
            else
            {
                var fileInfo = new System.IO.FileInfo(currentFilePath);
                UI.ExecuteJavascript($"CodeEditor.setTitle('{fileInfo.Name}');");
            }
        }
        //保存文件逻辑
        internal bool SaveFile()
        {
            var result = false;
            UI.EvaluateJavascript(@"CodeEditor.getContent()", (value, ex) =>
            {
                if (ex == null)
                {
                    var content = value.IsString ? value.StringValue : null;

                    if (content != null)
                    {

                        if (isNew)
                        {
                            var saveFileDialog = new SaveFileDialog()
                            {
                                AddExtension = true,
                                Filter = "支持的文件|*.txt;*.js;*.cs;*.html;*.htm;*.css;*.h;*.cpp;*.php;*.xml;*.vb",
                                OverwritePrompt = true
                            };
                            if (saveFileDialog.ShowDialog(this) == DialogResult.OK)
                            {
                                currentFilePath = saveFileDialog.FileName;
                                result = true;

                            }
                        }

                        if (result)
                        {
                            System.IO.File.WriteAllText(currentFilePath, content, Encoding.UTF8);
                            isClean = true;
                            SetEditorMode();
                            SetEditorTitle();
                        }



                    }
                }
            });

            return result;
        }
        //新建文件逻辑
        internal void NewFile()
        {
            var continueFlag = true;

            if (!isClean)
            {
                var ret = MessageBox.Show(this, "文件已经更改,是否保存下先?", "提示", MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question);

                if (ret == DialogResult.Yes)
                {
                    if (!SaveFile())
                    {
                        continueFlag = false;
                    }
                }
                else if (ret == DialogResult.Cancel)
                {
                    return;
                }
            }

            if (!continueFlag)
            {
                return;
            }

            isNew = true;
            isClean = true;


            UI.ExecuteJavascript(@"CodeEditor.setNew()");
            SetEditorTitle();



        }
        //打开文件逻辑
        internal string OpenFile()
        {
            var continueFlag = true;

            if (!isClean)
            {
                var ret = MessageBox.Show(this, "文件已经更改,是否保存下先?", "提示", MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question);

                if (ret == DialogResult.Yes)
                {
                    if (!SaveFile())
                    {
                        continueFlag = false;
                    }
                }
                else if (ret == DialogResult.Cancel)
                {
                    return null;
                }
            }

            if (!continueFlag)
            {
                return null;
            }

            var content = string.Empty;

            var openDialog = new OpenFileDialog()
            {
                AddExtension = true,
                Filter = "支持的文件|*.txt;*.js;*.cs;*.html;*.htm;*.css;*.h;*.cpp;*.php;*.xml;*.vb"
            };

            if (openDialog.ShowDialog() == DialogResult.OK)
            {
                currentFilePath = openDialog.FileName;

                var fileInfo = new System.IO.FileInfo(currentFilePath);

                content = System.IO.File.ReadAllText(fileInfo.FullName);

                isNew = false;

                SetEditorMode();
                SetEditorTitle();
            }
            else
            {
                content = null;
            }

            return content;
        }
    }
}

 

下边珍视来了,以下内容将涉及C#操作网页内JS代码以及JS调用C#的艺术等等,宗旨正是中档对象JsCode艾德itorObject。该对象承继自ChromiumFX的JSObject对象,对JS有打探的心上人不会对JS的Object对象认为目生,那里的JSObject对象和JS的Object对象实际很一般,也是含有了数量和方法的一个集结。如下所示,在里头注册了三个Function,那些Function都是能够被网页端js调用的。

namespace NanUI.Demo.CodeEditor
{
    using Chromium.Remote;
    using NetDimension.NanUI;

    class JsCodeEditorObject : JSObject
    {

        EditorForm parentForm;

        internal JsCodeEditorObject(EditorForm parentForm)
        {
            this.parentForm = parentForm;

            AddFunction("newFile").Execute += JsCodeEditorObject_ExecuteNew;

            AddFunction("openFile").Execute += JsCodeEditorObject_ExecuteOpen;

            AddFunction("saveFile").Execute += JsCodeEditorObject_ExecuteSave;

            AddFunction("setClean").Execute += JsCodeEditorObject_ExecuteSetClean;
        }





        private void JsCodeEditorObject_ExecuteSetClean(object sender, Chromium.Remote.Event.CfrV8HandlerExecuteEventArgs e)
        {
            if (e.Arguments.Length > 0)
            {

                parentForm.isClean = e.Arguments.First(p => p.IsBool).BoolValue;
            }
        }

        private void JsCodeEditorObject_ExecuteSave(object sender, Chromium.Remote.Event.CfrV8HandlerExecuteEventArgs e)
        {
            var result  = parentForm.SaveFile();

            e.SetReturnValue(CfrV8Value.CreateBool(result));

        }

        private void JsCodeEditorObject_ExecuteOpen(object sender, Chromium.Remote.Event.CfrV8HandlerExecuteEventArgs e)
        {
            var result = parentForm.OpenFile();

            if (result != null)
            {
                e.SetReturnValue(CfrV8Value.CreateString(result));

            }
            else
            {
                e.SetReturnValue(CfrV8Value.CreateNull());
            }
        }

        private void JsCodeEditorObject_ExecuteNew(object sender, Chromium.Remote.Event.CfrV8HandlerExecuteEventArgs e)
        {
            parentForm.NewFile();
        }
    }
}

如上边代码中所显示的,这么些类注册了newFile, openFile,
saveFile和setClean多少个点子供网页端js调用。再折回去地方EditorForm的代码,有这样一行:

UI.GlobalObject.Add("hostEditor", new JsCodeEditorObject(this));

那行代码的左右就是将大家的中间对象JsCode艾德itorObject实例化后传到浏览器的JS景况中,并且取了个新名字叫做“host艾德itor”,那样,我们就可见在网页景况中用js实行下边的多少个章程了。

  • hostEditor.newFile
  • hostEditor.openFile
  • hostEditor.saveFile
  • hostEditor.setClean

当网页端js调用地方那一个艺术的时候实在会实行到艾德itorForm中相应的操作逻辑,如此就完毕了js与c#条件的相互。C#与js情状相互与之相比较要轻易得多,举例艾德iorForm中的Set艾德itorTitle方法中,通过UI.ExecuteJavascript方法就足以执行web碰着中的js代码或方法。

UI.ExecuteJavascript($"CodeEditor.setTitle('新建');");

如上这行代码,调用了js的秘技Code艾德itor.setTitle来设置编辑器的标题。那么,尽管须要施行js代码并再次来到相应代码,就得利用UI.伊娃luateJavascript方法。该格局第三个参数为js代码,第2个参数为实行js代码后的回调,它是二个有多少个参数的action对象,第七个参数为回调的再次回到值,第二个参数是exception对象,假设js代码格外,那么第1个对象exception就富含了错误消息,正确实行时,excepiton对象回来null。

UI.EvaluateJavascript(@"CodeEditor.getContent()", (value, ex) =>
{
    if (ex == null)
    {
        var content = value.IsString ? value.StringValue : null; //value对象是CfrV8Value对象,内置了各种数据转换的方法。

        //其他逻辑
    }
});

 

有了地点的代码要点,大家应该已经清楚C#和JS之间的互相格局和JS于C#时期的互动的法子了。一言以蔽之,C#与NanUI的js交互,无重回值的用UI.ExecuteJavascript方法,有重回值的用UI.伊娃luateJavascript。除了那五个法子外,能够用UI.AddFunction方法来直接在js碰着中注册C#的情势,方法大家自行钻研在此不再演说。假设js必要与C#以内的互动,通过编写制定承继JSObject的中档对象注册格局或数量对象,就能够兑现。

那么,NanUI的演示第2集就这么讲完了,假若不掌握请留言给自家或进群(群号:贰41088256)沟通,多谢我们关心。

 


NanUI for .NET Winform系列目录


透过了那2个多星期的调动与修复,NanUI for .NET
Winform的稳固版已经公布。应普及群友的供给,现已将NanUI的全部代码开源。

GitHub: https://github.com/NetDimension/NanUI

Release: https://github.com/NetDimension/NanUI/releases


 

 如若您喜爱NanUI项目,你能够参加到NanUI的付出中来,当然你也可以更直接了当的支撑笔者的劳作,使用支付宝或微信扫描上边二维码请自个儿喝一杯热腾腾的咖啡。

图片 4

支付宝转账

图片 5

微信转载


 

除此以外,打个广告,继承NanUI分界面设计与接口开辟(收取金钱)。

案例突显

某聊天应用

图片 6

某商厦里面办公室系统

图片 7

图片 8

上边,初叶明日的以身作则

NanUI for Winform 使用示例【第三集】

山寨个代码编辑器

图片 9

二零一八年微软破天荒的揭发了个吊炸天的开源代码编辑器VS Code,阅览VS
Code的目录结构可见,其实它也是基于CEF来拓张开拓的,使用的是名字为electron的框架。那么,下边小编将用NanUI山寨2个回顾的Code编辑器落成对代码文件的新建、张开和保留操作,取名称为NanUI代码编辑器。

NanUI代码编辑器使用的大旨手艺有:

  • Bootstrap
  • CodeMirror
  • NanUI for Winform(作者掌握,那句话是废话)
  • 从离其余能源程序集加载财富

Bootstrap做响应式的页面吊炸天,即便大家前几日要开始展览的小示例用不到响应式布局,不过引用进来就当CSS
Clear用啊。其它贰个CodeMirror作为网页端最庞大的代码编辑器,这一次经过NanUI,大家的Winform也将享用它带动的雄强成效。上面,小编将分步疏解怎么样来山寨那个代码编辑器。

在VS中新建Windows
Application项目(后边称为主项目),然后在项目->属性->调节和测试中关闭“运行VS承载进度”选项,因为经超过实际践,开启该接纳后不能够加载嵌入的网页能源。同时,开启“启用本机代码调节和测试选项”,因为ChromiumFX使用了PInvoke的措施调用,会有多数莫名其妙的非托管错误,例如,小编事先就遇到个如若开动项目就报错的主题素材,开启了本机代码调节和测试后发掘是QQ拼音输入法钩子的难点,点个忽略继续就足以通常调试了。设置好后引用NanUI的库NetDimenison.NanUI.dll

图片 10

 

再新建三个类库项目(后边称为财富类型),在中间建立文件夹www,文件夹名字未有须要,随便就好,但要重申一点,html文件不可能在类库项目的根目录下,必须树立个文本夹来放置网页文书档案。将bootstrap和codemirror的html、css和js文件等拷贝进www目录,当然你也得以直接从nuget上下载它们,只是须求把nuget拿到的文书都拖到www里面,形成上面包车型客车文本结构。

图片 11

删去掉用不着的文件,从品种中清除或直接删除都行,剩下的内需用的品类都在性质窗口中把转换操作改成“嵌入的能源”。然后新建个静态类,名字随意取,里面新建个章程来暴光能源类型的Assembly。

namespace NanUI.Demo.CodeEditor.Resources
{
    public static class SchemeHelper
    {
        public static System.Reflection.Assembly GetSchemeAssembley()
        {
            return System.Reflection.Assembly.GetExecutingAssembly();
        }
    }
}

新建这几个类的效果是方便主项目登记能源类型里面包车型客车程序集,借使用那种艺术来注册能源文件须求在主项目中引用资源类型。别的叁个艺术,能够一直在主项目中一贯使用Assembly.LoadFile加载资源类型,若是项目要求平常更新的话用这几个格局能够完毕时时更新能源文件而不用重新安装整个软件,具体的用法会在以往的言传身教中介绍,在此就不多说了。

诸如此类,财富类型就弄好了。接下来的干活都将在主项目上拓展了。在主项目标main函数里初叶化NanUI。

namespace NanUI.Demo.CodeEditor
{
    using NetDimension.NanUI;

    static class Program
    {
        /// <summary>
        /// 应用程序的主入口点。
        /// </summary>
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            UIStartupManager.UseSharedFramework = true;
            if (UIStartupManager.InitializeChromium())
            {
                //初始化成功,加载程序集内嵌的资源到运行时中
                UIStartupManager.RegisterEmbeddedScheme(Resources.SchemeHelper.GetSchemeAssembley());



                //启动主窗体
                Application.Run(new EditorForm());
            }


        }
    }
}

其间,Resources.SchemeHelper.GetSchemeAssembley()方法正是从财富类型里面把Assembly加载过来。之后新建编辑器的主窗体艾德itorForm。艾德itorForm除了轻易的设置外,需其它增添多少个点子来支配文件的新建、张开、保存等操作。

namespace NanUI.Demo.CodeEditor
{
    using NetDimension.NanUI;

    public partial class EditorForm : HtmlUIForm
    {

        internal bool isClean = true;
        internal bool isNew = true;

        internal string currentFilePath = string.Empty;


        public EditorForm()
            : base("embedded://www/main.html")
        {
            InitializeComponent();

            UI.GlobalObject.Add("hostEditor", new JsCodeEditorObject(this));
        }

        void SetEditorMode()
        {
            if (!string.IsNullOrEmpty(currentFilePath))
            {
                var fileInfo = new System.IO.FileInfo(currentFilePath);

                var ext = fileInfo.Extension;

                if (ext.IndexOf('.') == 0)
                {
                    ext = ext.Substring(1);
                    UI.ExecuteJavascript($"CodeEditor.changeCodeScheme('{ext}');");
                }
            }
        }

        //设置编辑器标题逻辑
        void SetEditorTitle()
        {
            if (isNew || string.IsNullOrEmpty(currentFilePath))
            {
                UI.ExecuteJavascript($"CodeEditor.setTitle('新建');");
            }
            else
            {
                var fileInfo = new System.IO.FileInfo(currentFilePath);
                UI.ExecuteJavascript($"CodeEditor.setTitle('{fileInfo.Name}');");
            }
        }
        //保存文件逻辑
        internal bool SaveFile()
        {
            var result = false;
            UI.EvaluateJavascript(@"CodeEditor.getContent()", (value, ex) =>
            {
                if (ex == null)
                {
                    var content = value.IsString ? value.StringValue : null;

                    if (content != null)
                    {

                        if (isNew)
                        {
                            var saveFileDialog = new SaveFileDialog()
                            {
                                AddExtension = true,
                                Filter = "支持的文件|*.txt;*.js;*.cs;*.html;*.htm;*.css;*.h;*.cpp;*.php;*.xml;*.vb",
                                OverwritePrompt = true
                            };
                            if (saveFileDialog.ShowDialog(this) == DialogResult.OK)
                            {
                                currentFilePath = saveFileDialog.FileName;
                                result = true;

                            }
                        }

                        if (result)
                        {
                            System.IO.File.WriteAllText(currentFilePath, content, Encoding.UTF8);
                            isClean = true;
                            SetEditorMode();
                            SetEditorTitle();
                        }



                    }
                }
            });

            return result;
        }
        //新建文件逻辑
        internal void NewFile()
        {
            var continueFlag = true;

            if (!isClean)
            {
                var ret = MessageBox.Show(this, "文件已经更改,是否保存下先?", "提示", MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question);

                if (ret == DialogResult.Yes)
                {
                    if (!SaveFile())
                    {
                        continueFlag = false;
                    }
                }
                else if (ret == DialogResult.Cancel)
                {
                    return;
                }
            }

            if (!continueFlag)
            {
                return;
            }

            isNew = true;
            isClean = true;


            UI.ExecuteJavascript(@"CodeEditor.setNew()");
            SetEditorTitle();



        }
        //打开文件逻辑
        internal string OpenFile()
        {
            var continueFlag = true;

            if (!isClean)
            {
                var ret = MessageBox.Show(this, "文件已经更改,是否保存下先?", "提示", MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question);

                if (ret == DialogResult.Yes)
                {
                    if (!SaveFile())
                    {
                        continueFlag = false;
                    }
                }
                else if (ret == DialogResult.Cancel)
                {
                    return null;
                }
            }

            if (!continueFlag)
            {
                return null;
            }

            var content = string.Empty;

            var openDialog = new OpenFileDialog()
            {
                AddExtension = true,
                Filter = "支持的文件|*.txt;*.js;*.cs;*.html;*.htm;*.css;*.h;*.cpp;*.php;*.xml;*.vb"
            };

            if (openDialog.ShowDialog() == DialogResult.OK)
            {
                currentFilePath = openDialog.FileName;

                var fileInfo = new System.IO.FileInfo(currentFilePath);

                content = System.IO.File.ReadAllText(fileInfo.FullName);

                isNew = false;

                SetEditorMode();
                SetEditorTitle();
            }
            else
            {
                content = null;
            }

            return content;
        }
    }
}

 

上面着重来了,以下内容将涉及C#操作网页内JS代码以及JS调用C#的法子等等,宗旨正是中间对象JsCode艾德itorObject。该对象承袭自ChromiumFX的JSObject对象,对JS有询问的爱侣不会对JS的Object对象感觉目生,那里的JSObject对象和JS的Object对象实际很相似,也是带有了数额和艺术的2个相会。如下所示,在里边注册了多个Function,这个Function都以能够被网页端js调用的。

namespace NanUI.Demo.CodeEditor
{
    using Chromium.Remote;
    using NetDimension.NanUI;

    class JsCodeEditorObject : JSObject
    {

        EditorForm parentForm;

        internal JsCodeEditorObject(EditorForm parentForm)
        {
            this.parentForm = parentForm;

            AddFunction("newFile").Execute += JsCodeEditorObject_ExecuteNew;

            AddFunction("openFile").Execute += JsCodeEditorObject_ExecuteOpen;

            AddFunction("saveFile").Execute += JsCodeEditorObject_ExecuteSave;

            AddFunction("setClean").Execute += JsCodeEditorObject_ExecuteSetClean;
        }





        private void JsCodeEditorObject_ExecuteSetClean(object sender, Chromium.Remote.Event.CfrV8HandlerExecuteEventArgs e)
        {
            if (e.Arguments.Length > 0)
            {

                parentForm.isClean = e.Arguments.First(p => p.IsBool).BoolValue;
            }
        }

        private void JsCodeEditorObject_ExecuteSave(object sender, Chromium.Remote.Event.CfrV8HandlerExecuteEventArgs e)
        {
            var result  = parentForm.SaveFile();

            e.SetReturnValue(CfrV8Value.CreateBool(result));

        }

        private void JsCodeEditorObject_ExecuteOpen(object sender, Chromium.Remote.Event.CfrV8HandlerExecuteEventArgs e)
        {
            var result = parentForm.OpenFile();

            if (result != null)
            {
                e.SetReturnValue(CfrV8Value.CreateString(result));

            }
            else
            {
                e.SetReturnValue(CfrV8Value.CreateNull());
            }
        }

        private void JsCodeEditorObject_ExecuteNew(object sender, Chromium.Remote.Event.CfrV8HandlerExecuteEventArgs e)
        {
            parentForm.NewFile();
        }
    }
}

如下面代码中所呈现的,那个类注册了newFile, openFile,
saveFile和setClean多少个章程供网页端js调用。再折回来地点艾德itorForm的代码,有那般一行:

UI.GlobalObject.Add("hostEditor", new JsCodeEditorObject(this));

那行代码的左右正是将大家的中间对象JsCode艾德itorObject实例化后传到浏览器的JS意况中,并且取了个新名字叫做“host艾德itor”,那样,大家就可见在网页意况中用js推行上面包车型地铁多少个方式了。

  • hostEditor.newFile
  • hostEditor.openFile
  • hostEditor.saveFile
  • hostEditor.setClean

当网页端js调用地点这几个办法的时候其实会实行到EditorForm中相应的操作逻辑,如此就贯彻了js与c#情状的竞相。C#与js情况互相与之相比较要轻松得多,举例艾德iorForm中的Set艾德itorTitle方法中,通过UI.ExecuteJavascript方法就足以实施web蒙受中的js代码或措施。

UI.ExecuteJavascript($"CodeEditor.setTitle('新建');");

如上这行代码,调用了js的法门Code艾德itor.setTitle来安装编辑器的题目。那么,假使急需实行js代码并回到相应代码,就得使用UI.伊娃luateJavascript方法。该格局第一个参数为js代码,第①个参数为举办js代码后的回调,它是一个有五个参数的action对象,第2个参数为回调的再次回到值,第一个参数是exception对象,假设js代码失常,那么第二个对象exception就带有了错误新闻,精确实践时,excepiton对象回来null。

UI.EvaluateJavascript(@"CodeEditor.getContent()", (value, ex) =>
{
    if (ex == null)
    {
        var content = value.IsString ? value.StringValue : null; //value对象是CfrV8Value对象,内置了各种数据转换的方法。

        //其他逻辑
    }
});

 

有了地方的代码要点,我们应该早就清楚C#和JS之间的竞相格局和JS于C#里头的相互的法子了。简单的讲,C#与NanUI的js交互,无再次来到值的用UI.ExecuteJavascript方法,有再次来到值的用UI.伊娃luateJavascript。除了那七个措施外,能够用UI.AddFunction方法来直接在js情形中注册C#的形式,方法大家自行钻研在此不再演讲。要是js供给与C#时期的并行,通过编写制定承接JSObject的中等对象注册方式或数量对象,就可以兑现。

那么,NanUI的示范第一集就像此讲完了,借使不晓得请留言给自个儿或进群(群号:二四1088256)沟通,谢谢我们关怀。

 


NanUI for .NET Winform体系目录


通过了那1个多星期的调节与修复,NanUI for .NET
Winform的牢固版已经透露。应广泛群友的须求,现已将NanUI的总体代码开源。

GitHub: https://github.com/NetDimension/NanUI

Release: https://github.com/NetDimension/NanUI/releases


 

 要是你喜欢NanUI项目,你能够涉足到NanUI的开拓中来,当然你也得以更直接了当的帮助自个儿的劳作,使用支付宝或微信扫描下边2维码请笔者喝一杯热腾腾的咖啡。

图片 12

支付宝转账

图片 13

微信转载


 

其余,打个广告,承继NanUI分界面设计与接口开采(收取费用)。

案例展现

某聊天应用

图片 14

某市肆内部办公室系统

图片 15

图片 16