永利棋牌官方下载-www.55402.com-永利国际唯一指定官网

永利棋牌官方下载提供最新最好玩的真人游戏,www.55402.com是澳门国际娱乐平台官方网站唯一授权会员登录手机版,www.316net,www.366net,516.net,626.net,766.net,www.565.net,www.16.net,bwin62.com,bwin180.com,永利国际唯一指定官网为新老顾客提供更多的精彩娱乐项目,,所有的玩家都可以得到注册送体验金的巨大福利是设身处地为玩家量身订造的经典网站。

NanUI for Winform 使用示例【第一集】——山寨个代

NanUI for Winform从今日写博客公布到前日得到了和多朋友的关心,首先多谢大家的关怀和支撑!请看几日前自己的博文《NanUI for Winform发布,让Winform分界面设计有着特别大概》。

有爱人问到笔者是或不是考虑开源NanUI,小编想应对是必然的。可是当前来看NanUI内部还应该有黄金时代部分标题并不曾获得缓慢解决,由此暂且不会盛放源代码。待那个主题素材顺遂解决现在小编会第分外间把NanUI的源码放到GitHub,请稍等片刻。

那正是说,从前不久起作者会时断时续放出部分NanUI使用的有的小示例和源代码供感兴趣的仇敌参谋把玩。任何有关NanUI的主题素材迎接大家进群(群号:241088256卡塔尔国或留言与本身调换。

上边,开头明日的身体力行

NanUI for Winform 使用示例【第后生可畏集】

NanUI for Winform 使用示例【第一集】——山寨个代码编辑器。山寨个代码编辑器

图片 1

二〇一八年微软破天荒的颁发了个吊炸天的开源代码编辑器VS Code,旁观VS Code的目录结构可以预知,其实它也是依照CEF来进展支付的,使用的是名叫electron的框架。那么,上面小编将用NanUI山寨一个简易的Code编辑器达成对代码文件的新建、展开和保存操作,取名叫NanUI代码编辑器。

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

  • Bootstrap
  • NanUI for Winform 使用示例【第一集】——山寨个代码编辑器。CodeMirror
  • NanUI for Winform(作者精通,那句话是废话卡塔尔国
  • 从离别的能源程序集加载财富

Bootstrap做响应式的页面吊炸天,即便大家今天要开展的小示例用不到响应式布局,不过援用进来就当CSS Clear用呢。此外二个CodeMirror作为网页端最精锐的代码编辑器,此次通过NanUI,大家的Winform也将享用它带给的雄强作用。下边,笔者将分步批注怎么样来山寨那几个代码编辑器。

在VS中新建Windows Application项目(后边称为主项目卡塔 尔(英语:State of Qatar),然后在档案的次序->属性->调节和测量检验中关闭“运维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();
        }
    }
}

NanUI for Winform 使用示例【第一集】——山寨个代码编辑器。新建那些类的意义是方便主项目登记能源类型里面包车型大巴程序集,假诺用这种措施来注册财富文件要求在主项目中引用进资金源类型。别的贰个主意,能够直接在主项目中平素运用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加载过来。之后新建编辑器的主窗体EditorForm。EditorForm除了轻松的设置外,需别的增多多少个方法来支配文件的新建、张开、保存等操作。

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#的章程等等,宗旨正是高级中学级对象JsCodeEditorObject。该对象世袭自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));

那行代码的左右就是将大家的高级中学级对象JsCodeEditorObject实例化后传到浏览器的JS遭遇中,况兼取了个新名字叫做“hostEditor”,那样,大家就可以看到在网页处境中用js推行下边包车型地铁多少个办法了。

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

当网页端js调用地点那么些措施的时候实在会施行到艾德itorForm中相应的操作逻辑,如此就贯彻了js与c#条件的相互。C#与js景况相互与之比较要简明得多,比如EdiorForm中的Set艾德itorTitle方法中,通过UI.ExecuteJavascript方法就可以推行web景况中的js代码或情势。

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

如上那行代码,调用了js的不二等秘书技CodeEditor.setTitle来安装编辑器的题目。那么,假诺急需实践js代码并回到相应代码,就得使用UI.EvaluateJavascript方法。该办法第3个参数为js代码,第2个参数为进行js代码后的回调,它是一个有四个参数的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.EvaluateJavascript。除了那八个点子外,能够用UI.AddFunction方法来一直在js情况中注册C#的主意,方法我们自行钻研在这里不再演说。如若js供赋予C#里面包车型地铁竞相,通过编写制定世袭JSObject的中游对象注册格局或数量对象,就能够达成。

那么,NanUI的示范第意气风发集就那样说罢了,借使不晓得请留言给自家或进群(群号:241088256卡塔 尔(英语:State of Qatar)调换,感激大家关切。

 


NanUI for .NET Winform体系目录

  • NanUI for Winform发表,让Winform分界面设计有所特别恐怕
  • NanUI for Winform 使用示例【第风流罗曼蒂克集】——山寨个代码编辑器
  • NanUI for Winform 使用示例【第二集】——做三个所见即所得的马克down编辑器

由此了那贰个多星期的调解与修复,NanUI for .NET Winform的稳固版已经揭橥。应普遍群友的渴求,现已将NanUI的整整代码开源。

GitHub: 

Release: 


 

 固然你快乐NanUI项目,你能够出席到NanUI的费用中来,当然你也足以更直接了当的支持自个儿的工作,使用支付宝或Wechat扫描下边二维码请小编喝风姿罗曼蒂克杯热腾腾的咖啡。

图片 4

支付宝转账

图片 5

Wechat转载


 

除此以外,打个广告,承袭NanUI分界面设计与接口开辟(收取金钱卡塔 尔(英语:State of Qatar)。

案例突显

某谈心应用

图片 6

某集团内部办公室系统

图片 7

图片 8

本文由永利棋牌官方下载发布于永利棋牌官方下载,转载请注明出处:NanUI for Winform 使用示例【第一集】——山寨个代

您可能还会对下面的文章感兴趣: