【C#】Winform NanUI 0.77版本 读取嵌入式资源
引入NanUI框架
这三个组件都要引入了,NetDimension.NanUI.AssemblyResourceHandler 是属于嵌入式资源部分,
下载地址:
由于作者已经废弃了这个版本,在VS2019中的 NuGet 程序包 中已经下载不了,我这里上传了,有需要的可以点击下面链接下载
NanUI.AssemblyResourceHandler.0.7.4 下载
另外,NanUI.AssemblyResourceHandler 源码github地址:GitHub - maxjove/NanUI-AssemblyResourceHandler: AssemblyResourceHandler for NanUI
有需要的可以下载下来进行编译,生成的dll,引入项目中就可以使用了。我打开后,发现里面没有项目的依赖项,所以会报错,这里,需要你手动解决这些问题了。
NanUI官方源码地址:https://gitee.com/xiaoxiongcn/NanUI 下载下来后,可以自行切换对应的版本号
对比NanUI0.88 和 NanUI0.77:
最新版NanUI0.88版本,依然有许多需要改进的地方,比如运行起来还比较卡,两个网页来回切换,程序内存不停的增加,而且不会释放,导致程序越来越卡。NanUI0.77版本官方标志着有严重bug,已经废弃,相对来说,NanUI0.77版本占用内存比较小,运行流程,但功能对比0.88版本要少很多,比如无法读取本地资源,清除cookie等。我也测试过,两个界面来回切换的问题,在0.77版本不会有内存不停的增加的情况。
官方对的0.77版本重大bug的解释:
关于内存不停增加的问题,主界面和页面1进行不停的切换,内存可以达到一个G以上,并且还可以不停的继续上涨,我初步怀疑是因为插件所用的工厂模式,不停的new一个类,而系统并没有释放内存,具体原因我没有验证。
=========================================
案例:
Program.cs
using NetDimension.NanUI; using System; using System.Windows.Forms; namespace NanUI077Test { static class Program { /// <summary> /// 应用程序的主入口点。 /// </summary> [STAThread] static void Main() { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Bootstrap .Initialize() //注册嵌入资源,并为指定资源指定一个假的域名www.app.local .UseAssembledResource(System.Reflection.Assembly.GetExecutingAssembly(), ResourceHandlerScheme.Http, "www.app.local", "View") .WithChromiumCommandLineArguments((procesName, cmd) => { // 在此处处理CEF的命令行参数 }) .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
using NetDimension.NanUI; using NetDimension.NanUI.Browser; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace NanUI077Test { public class MainIndex : Formium { public override string StartUrl => "www.app.local/index.html"; public override HostWindowType WindowType => HostWindowType.Standard; protected override Control LaunchScreen => null; public MainIndex() { ContainerForm.FormClosing += MyForm_FormClosing; } //使用 OnRegisterGlobalObject 重载方法,您可以向浏览器的 Javascript 上下文注册各种.NET 对象和方法, //您可以把该重载方法的参数 global 看作浏览器的 window 对象。 protected override void OnRegisterGlobalObject(JSObject global) { var myObject = global.AddObject("CSharpProject"); var MyLoadUrl = myObject.AddFunction("LoadUrl"); MyLoadUrl.Execute += (func, args) => { var argsValue = args.Arguments.FirstOrDefault(p => p.IsString); string pageName = argsValue?.StringValue; if (!string.IsNullOrEmpty(pageName)) { string url = @"www.app.local/" + pageName; LoadUrl(url); } }; } //使用 OnWindowReady 重载方法,您可以 browserClient 参数来设置 Chromium 客户端的各个处理器, //以此来实现 Chromium 浏览器的各项行为,例如:如何处理新开窗口、如何处理下载请求、 //如何通知应用程序网页标题的改变等等行为。 protected override void OnWindowReady(IWebBrowserHandler browserClient) { //打开控制台 WebBrowser.ShowDevTools(); browserClient.LoadHandler.OnLoadEnd += LoadHandler_OnLoadEnd; } private void LoadHandler_OnLoadEnd(object sender, Chromium.Event.CfxOnLoadEndEventArgs e) { if (e.Frame.IsMain) { Console.WriteLine("[MainIndex]当窗体加载完成时"); } } private void MyForm_FormClosing(object sender, FormClosingEventArgs e) { Console.WriteLine("[MainIndex]当窗体关闭时"); } //如果您还想进一步定制您的窗口样式,请重载 OnStandardFormStyle 方法, //并使用 style 参数来设置窗口启动位置、大小、图标、边框样式等信息。 protected override void OnStandardFormStyle(IStandardHostWindowStyle style) { base.OnStandardFormStyle(style); Title = "第一个NanUI应用"; style.Width = 1280; style.Height = 720; style.Icon = System.Drawing.SystemIcons.WinLogo; style.StartPosition = FormStartPosition.CenterScreen; } } }
下面是网页部分,这里将在NanUI里面实现两个界面的互相跳转,关于界面跳转,用JS自带的方法也是可以的,见下面JS中的注释代码,我用里主要演示JS调用C#代码。
index.html
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> <script> function onclick1() { //window.location.href = "win1.html"; CSharpProject.LoadUrl("win1.html"); } function onclick2(){ } </script> </head> <body> <div>我的网页</div> <div> <button onclick="onclick1()">按钮1</button> <button onclick="onclick2()">按钮2</button> </div> <div> <input type="text" id="my_input" oninput="OnInout(event)" onpropertychange="OnPropChanged(event)"> </div> <div> <input type="text" id="username" autoComplete='off'> <div id="result"></div> </div> </body> </html>
win1.html
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> <script type="text/javascript"> function OnClick1() { //window.location.href = "index.html"; //window.open("index.html") CSharpProject.LoadUrl("index.html"); } function OnClick2(){ } </script> </head> <body> <h1>页面1</h1> <h1> <button onclick="OnClick1()">返回主界面</button> <button onclick="OnClick2()">按钮2</button> </h1> <img src="img/test.jpg" alt="测试" /> </body> </html>
项目:
将View里面的资源全部改为嵌入式资源
end
原文链接https://blog.csdn.net/qq_38693757/article/details/116235466
猜你喜欢
- 【C#】从零开始用C#写一个桌面应用程序(一)基础操作
- 准备winform应用程序编写桌面应用客户端的技术。xaml一种标记语言。winform程序组成。 程序入口: form.cs和它的设计文件: 启动的过程以及涉及的文件:main函数: form1的构造函数和它的设计文件: main-》构造form-》initializeComponent-》 拖入一个 button控件可以看到: 这时我们已经梳理启动过程。使用组件的方法 可以在
- 【C#】C# NLua Winform 热更新
- 一、概述NLua 是一个用于 .NET 平台的 Lua 脚本绑定库。它允许在 C# 代码中嵌入 Lua 脚本,并允许两者之间进行交互。NLua 的主要特点包括:轻量级:NLua 是一个轻量级的库,易于集成到现有的 .NET 项目中。动态类型:Lua 是动态类型的语言,这意味着变量的类型可以在运行时改变。灵活的绑定:NLua 提供了灵活的绑定机制,使得 C# 和 Lua 之间的数据交互变得简单。丰富的 API:NLua 提供了丰富的 API,以便在 Lua 脚本中调用 .NET 的类和方法。调试支
- 【C#】C# Winform 配置文件App.config
- 目录一、简介二、添加引用 三、添加节点1.普通配置节点2.数据源配置节点四、管理类 ConfigHelper.cs1.获取配置节点2.更新或加入配置节点结束一、简介在C#中,配置文件很常用,ASP.NET 和 Winform 名称不同,用法一样,如下图config 文件通常用来存储一些需要修改的数据,比如用户名密码,连接数据库的IP地址等,而不是在代码中写死。有人可能会问,那我自己自定义一个配置文件也行,为什么要用它这个?区别当然有,微软自己封装的读取和写入会更简单一些,你自己封装的,
- 【C#】C# Winform 热更新 基于ECSharp框架
- 目录一、简介二、 ECSharp热更新演示三、Winform 热更新实战结束一、简介ECSharp (原:EasySharpFrame)github 地址:https://github.com/suxf/ECSharp介绍:1.HTTP服务 2.Websocket服务 3.HyperSocket<自定义Socket服务> 4.TimeFlow<时间流> 5.Sqlserver数据库助手 6.Mysql数据助手 7.Redis数据库助手 8.Log功能 9.热更新
- 【C#】C#的DateTimePicker控件(日期控件)
- 目录一、使用DateTimePicker控件显示时间二、使用DateTimePicker控件以自定义格式显示日期三、返回DateTimePicker控件中选择的日期1.源码2.生成效果 DateTimePicker控件(日期控件)用于选择日期和时间,DateTimePicker控件只能选择一个时间,而不是连续的时间段,也可以直接输入日期和时间。一、使用DateTimePicker控件显示时间
- 【C#】Winform NanUI 0.88版本 用官方源码搭建原生态开发环境
- 目录一、需求二、搭建原生开发环境1.导入源码2.解决源码报错错误1错误23.导入其他项目4.官方Demo运行效果三、创建自己的NanUI项目1.新建项目2.导入NanUI.Runtime扩展包3.添加NanUI程序集的引用4.MainIndex主界面相关代码5.Program程序入口相关代码6.读取本地前端文件的处理四、测试项目效果五、结束一、需求NanUI 插件确实很方便,但想改其中的需求怎么办,下面就来自己搭建NanUI 原生开发环境,在此很感谢作者免费的开源。官方源码地址:GitHub -
- 【C#】C#调用win10系统自带软键盘的方法
- 上次做了个笔记是关于调用windows系统自带的触摸键盘的方法:C#调用Windows系统自带触摸键盘的方法_c# 虚拟键盘-CSDN博客除了调用触摸键盘,我们也可以通过调用win10的自带软键盘作为输入途径。方法很简单。1、添加using System.Diagnostics引用。2、创建进程Process Winvirkey = Process.Start("osk.exe");3、打开键盘:Winvirkey = Process.Start("osk.exe&
- 【C#】C#Windows桌面应用开发实践
- 速览必须功能一览简单下载异步下载如何解决下载文件不完整的问题使用 Downloader 进行 HTTP 多线程下载创建一个下载服务:下载非 HTTP 协议的文件注册表相关的操作(添加与删除)文件占用问题的处理防止重复启动只开一个实例,通用弹窗和提示 使用示例使用 C# 下载文件 (引用自使用 C# 下载文件的十八般武艺)常用接口示例必须功能一览注册表相关的操作(添加与删除) RegistryKey hkm