Winform NanUI 0.77版本 读取本地资源(扩展功能)

在NanUI官方的文档中,是有一个NanUI.FileResourceHandler的扩展包的,但现在只有0.88版本中有一个NanUI.LocalFileResource程序包,而0.77版本只剩下了一个读取嵌入式资源的程序包。

参考:https://www.cnblogs.com/linxuanchen/p/the-nanui-0-7-release-notes.html

Winform NanUI 0.77版本 读取本地资源(扩展功能)

在扩展功能之前,请参考https://zhuanlan.zhihu.com/p/109023019 ,我参考这个帖子进行扩展的,也不知道改的对不对,总之功能是实现了。

然后将NanUI0.77源码拷贝到你的项目中,将源码中的Resources.Designer.cs代码复制到你项目中的Resources.Designer.cs 中,同时将源码中的Resources文件夹拷贝到你的项目中。

点击添加资源,将Resources文件夹所有文件选中,然后添加,就如下图所示。

Winform NanUI 0.77版本 读取本地资源(扩展功能)

这些资源是用来显示浏览器的控制台的,在这里我不做过多介绍。

如果你的源码正常运行,成功显示页面和控制台,js调用c# ,和c#调用js都正常,说明各方面搭建成功,可以开始下面的步骤。

我项目结构如下图,部分文件夹是我自己加的

Winform NanUI 0.77版本 读取本地资源(扩展功能)

打开ResourceHandlerRegister.cs ,没有这个脚本可以自己新建,这里我是导入了官方的嵌入式资源源码,所以已经有这个脚本了,这些源码可以搜索作者的github就可以下载了。

using System;

namespace NetDimension.NanUI
{
    public static class ResourceHandlerRegister
    {
        //读取嵌入式资源
        //参考:https://zhuanlan.zhihu.com/p/109022286
        public static Bootstrap UseAssembledResource(this Bootstrap _, ResourceHandlerScheme scheme, string domain, string basePath = null)
        {
            //GC.Collect();
            Bootstrap.RegisterCustomResourceHandler(() => new AssembledResource(scheme, domain, basePath));
            return _;
        }

        //REST资源处理器
        //参考:https://zhuanlan.zhihu.com/p/109023845
        public static Bootstrap UseRestfulService(this Bootstrap _, ResourceHandlerScheme scheme, string domain, Action<RestfulService.RestfulServiceProvider> provider = null)
        {
            //GC.Collect();
            Bootstrap.RegisterCustomResourceHandler(() =>
            {
                var resourceHandler = new RestfulServiceResource(scheme, domain);
                provider?.Invoke(RestfulService.RestfulServiceProvider.Create(resourceHandler));
                return resourceHandler;
            });
            return _;
        }

        //读取本地资源目录
        //参考:https://zhuanlan.zhihu.com/p/109023019
        public static Bootstrap UseClockResourceHandler(this Bootstrap _, ResourceHandlerScheme scheme, string domain, string filePath)// 如果您的资源处理器有其他参数,参数表因添加在末尾处)
        {
            //GC.Collect();
            Bootstrap.RegisterCustomResourceHandler(() => new CustomResourceFactory(scheme, domain, filePath));
            return _;
        }
    }
}

新建脚本 CustomResourceFactory.cs

using Chromium;
using NetDimension.NanUI.ResourceHandler;

namespace NetDimension.NanUI
{
    public class CustomResourceFactory : CustomResource
    {
        private string ViewFolder = string.Empty;

        public CustomResourceFactory(ResourceHandlerScheme scheme, string domain,string viewFolder)
            : base(scheme, domain)
        {
            ViewFolder = viewFolder;
        }

        protected override ResourceHandlerBase GetResourceHandler(string schemeName, CfxBrowser browser, CfxFrame frame, CfxRequest request)
        {
            return new CustomResourceHandler(ViewFolder);
        }
    }
}

新建脚本 CustomResourceHandler.cs

using Chromium;
using NetDimension.NanUI.ResourceHandler;
using System;
using System.Collections.Generic;
using System.IO;

namespace NetDimension.NanUI
{
    public class CustomResourceHandler : ResourceHandlerBase
    {
        private List<string> FilesinfoList = new List<string>();

        protected override FormiumResponse GetResponse(FormiumRequest request)
        {
            FormiumResponse response = new FormiumResponse();
            if (request.Method != Method.GET)
            {
                response.Status = (int)System.Net.HttpStatusCode.NotFound;
                return response;
            }

            string physicalFilePath = string.Empty;
            if (FilesinfoList.Count > 0)
            {
                string[] sArr = request.RequestUrl.Split('/');
                if(sArr.Length > 2)
                {
                    string fileName = sArr[sArr.Length - 1];
                    for (int i = 0; i < FilesinfoList.Count; i++)
                    {
                        string _FileName = System.IO.Path.GetFileName(FilesinfoList[i]);
                        if (_FileName.Equals(fileName))
                        {
                            physicalFilePath = FilesinfoList[i];
                            break;
                        }
                    }
                }
            }
            else
            {
                response.Status = (int)System.Net.HttpStatusCode.NotFound;
                return response;
            }

            if (File.Exists(physicalFilePath))
            {
                response.ContentStream = File.OpenRead(physicalFilePath);
                response.MimeType = CfxRuntime.GetMimeType(Path.GetExtension(physicalFilePath).Trim('.')) ?? "text/plain";
            }
            else
            {
                response.Status = (int)System.Net.HttpStatusCode.NotFound;
            }
            return response;
        }

        private void GetDirectoryFileList(string path)
        {
            DirectoryInfo directory = new DirectoryInfo(path);
            FileSystemInfo[] filesArray = directory.GetFileSystemInfos();
            foreach (var item in filesArray)
            {
                if (item.Attributes == FileAttributes.Directory)
                    GetDirectoryFileList(item.FullName);
                else
                    FilesinfoList.Add(item.FullName);
            }
        }

        public CustomResourceHandler(string viewFolder)
        {
            string viewFullPath = Path.Combine(System.Windows.Forms.Application.StartupPath, viewFolder);

            if (System.IO.Directory.Exists(viewFullPath))
                GetDirectoryFileList(viewFullPath); 
        }
    }
}

调用,Program.cs

using NetDimension.NanUI;
using System;
using System.Windows.Forms;

namespace NanUI077_SourceCode
{
    static class Program
    {
        /// <summary>
        /// 应用程序的主入口点。
        /// </summary>
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);

            Bootstrap
            .Initialize()
            //注册嵌入资源,并为指定资源指定一个假的域名www.app.local
            //.UseAssembledResource(ResourceHandlerScheme.Http, "www.app.local", "View")
            //读取本地资源
            .UseClockResourceHandler(ResourceHandlerScheme.Http, "www.app.local", "View")
            .WithChromiumCommandLineArguments((procesName, cmd) =>
            {
                // 在此处处理CEF的命令行参数
                cmd.AppendSwitch("xxxxxx");
            })
            .WithChromiumSettings(settings =>
            {
                // 在此处处理CEF的设置
            })
            .WhenLibCefNotFound(args =>
            {
                // 如果NanUI启动器没有检测到正确的CEF以及ChromiumFX运行环境,将执行此处理过程。
                MessageBox.Show("没有检测到Chromium Embedded运行环境,请确认libcef环境配置正确。", "libcef.dll is not found", MessageBoxButtons.OK, MessageBoxIcon.Error);
            })
            .Run(() =>
            {
                return new MainIndex();
            });
        }
    }
}

MainIndex.cs 脚本看我其他帖子,已经写了很多遍了,这里不贴代码了。

fx文件夹是cef的资源文件夹,这个如果没有,去你其他的NanUI项目中拷贝过来,或者你自己生成资源。

在你的这个exe文件同级目录下,加入一个View文件夹,将web前端代码放进去就好了。

Winform NanUI 0.77版本 读取本地资源(扩展功能)

view文件夹

Winform NanUI 0.77版本 读取本地资源(扩展功能)

运行:

Winform NanUI 0.77版本 读取本地资源(扩展功能)

end

上一篇:c语言入门经典(第5版)


下一篇:winform 隐藏主窗体