Winform从前几天写博客发表到现行反革命得到了和多朋友的关怀,Winform从前几天写博客宣布到以后赢得了和多朋友的爱抚

NanUI for
Winform从后天写博客公布到未来得到了和多朋友的关心,首先多谢大家的酷爱和支持!请看前日自己的博文《NanUI
for
Winform宣布,让Winform分界面设计具有极其可能
》。

【请留心:此文已过期,0.陆版NanUI完成情势各异!!!】

有意中人问到笔者是还是不是思量开源NanUI,小编想回答是必然的。然而当前来看NanUI内部还有局地标题并不曾获得消除,因而一时不会盛开源代码。待那几个难题顺遂消除现在小编会第近来间把NanUI的源码放到GitHub,请稍等片刻。

 

那么,从明日起作者会6续释放部分NanUI使用的一些小示例和源代码供感兴趣的仇敌参考把玩。任何关于NanUI的主题材料欢迎大家进群(群号:二四十8825陆)或留言与本身沟通。

NanUI for
Winform从明日写博客公布到现行反革命拿走了和多朋友的关爱,首先多谢大家的关心和支撑!请看今日笔者的博文《NanUI
for
Winform发表,让Winform分界面设计有着极其恐怕
》。

下边,初步今日的演示

有心上人问到笔者是或不是思索开源NanUI,笔者想回答是自然的。不过当前来看NanUI内部还有一对主题材料并未赢得消除,因而权且不会绽放源代码。待那些主题材料顺遂消除以往小编会第一时半刻间把NanUI的源码放到GitHub,请稍等片刻。

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

这正是说,从今日起作者会陆续放出部分NanUI使用的部分小示例和源代码供感兴趣的恋上党参考把玩。任何有关NanUI的主题素材欢迎大家进群(群号:24十88256)或留言与小编调换。

山寨个代码编辑器

图片 1

二零一八年微软破天荒的布告了个吊炸天的开源代码编辑器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

 

再新建3个类库项目(后边称为能源类型),在里边建立文件夹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对象实际很相似,也是带有了数额和章程的1个聚众。如下所示,在中间注册了七个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));

那行代码的左右就是将大家的中档对象JsCodeEditorObject实例化后传到浏览器的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.EvaluateJavascript方法。该办法第三个参数为js代码,第一个参数为实行js代码后的回调,它是三个有多个参数的action对象,第3个参数为回调的再次来到值,第二个参数是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.EvaluateJavascript。除了那七个艺术外,能够用UI.AddFunction方法来平素在js环境中注册C#的措施,方法大家自行钻研在此不再演讲。借使js必要与C#中间的互动,通过编写制定承袭JSObject的中档对象注册形式或数量对象,即可兑现。

那正是说,NanUI的以身作则第3集仿佛此讲完了,如若不亮堂请留言给自身或进群(群号:二4108825六)交换,感激我们关注。

 


NanUI for .NET Winform种类目录


由此了那二个多星期的调动与修补,NanUI for .NET
Winform的牢固版已经揭露。应广大群友的渴求,现已将NanUI的一切代码开源。

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

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


 

 如果您欣赏NanUI项目,你能够参预到NanUI的支出中来,当然你也得以更直接了当的支持自个儿的行事,使用支付宝或微信扫描下边二维码请本人喝一杯热腾腾的咖啡。

图片 4

支付宝转账

图片 5

微信转发


 

其它,打个广告,承继NanUI界面设计与接口开荒(收取薪水)。

案例突显

某聊天应用

图片 6

某店4里面办公室系统

图片 7

图片 8

上边,开始今日的示范

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

山寨个代码编辑器

图片 9

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的措施调用,会有多数不3不肆的非托管错误,例如,小编事先就碰见个比方开动项目就报错的题材,开启了本机代码调节和测试后发现是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对象实际很一般,也是富含了数码和措施的四个凑合。如下所示,在内部注册了八个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的代码,有诸如此类1行:

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代码,第三个参数为施行js代码后的回调,它是3个有五个参数的action对象,第二个参数为回调的再次来到值,第一个参数是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的以身作则第2集就像是此讲完了,假如不知底请留言给自个儿或进群(群号:二四108825陆)交换,谢谢大家关怀。

 


NanUI for .NET Winform体系目录


经过了那二个多星期的调动与修补,NanUI for .NET
Winform的稳定版已经发表。应广大群友的渴求,现已将NanUI的漫天代码开源。

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

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


 

 纵然你欣赏NanUI项目,你能够涉足到NanUI的付出中来,当然你也足以更直接了当的支撑小编的办事,使用支付宝或微信扫描上面二维码请自个儿喝一杯热腾腾的咖啡。

图片 12

支付宝转账

图片 13

微信转载


 

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

案例突显

某聊天应用

图片 14

某店肆里面办公室系统

图片 15

图片 16

相关文章