【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# NLua Winform 热更新
- 一、概述NLua 是一个用于 .NET 平台的 Lua 脚本绑定库。它允许在 C# 代码中嵌入 Lua 脚本,并允许两者之间进行交互。NLua 的主要特点包括:轻量级:NLua 是一个轻量级的库,易于集成到现有的 .NET 项目中。动态类型:Lua 是动态类型的语言,这意味着变量的类型可以在运行时改变。灵活的绑定:NLua 提供了灵活的绑定机制,使得 C# 和 Lua 之间的数据交互变得简单。丰富的 API:NLua 提供了丰富的 API,以便在 Lua 脚本中调用 .NET 的类和方法。调试支
- 【C#】C# Winform 多个程序之间的通信(非Scoket)
- 效果功能:打开窗体自动连接主程序,并自动添加到列表,可以向子程序群发消息可以向单个程序单独发送消息在退出程序后,添加的程序列表会自动移除一、概述参考:C# Winfrom程序之间通讯_c# sendmessege copydatastruct 返回多个值_熊思宇的博客-CSDN博客在之前我写过 winform 程序与程序之间的通信,但是这个版本有个问题,那就是只能由两个程序进行通信,同时打开多个程序的话,接收方收到的数据就会一模一样,这次发表这个教程,也就是要解决这个问题。归根结底,还是&nbs
- 【C#】C#的DateTimePicker控件(日期控件)
- 目录一、使用DateTimePicker控件显示时间二、使用DateTimePicker控件以自定义格式显示日期三、返回DateTimePicker控件中选择的日期1.源码2.生成效果 DateTimePicker控件(日期控件)用于选择日期和时间,DateTimePicker控件只能选择一个时间,而不是连续的时间段,也可以直接输入日期和时间。一、使用DateTimePicker控件显示时间
- 【C#】C# Winform DataGridView 控件和 DataTable
- 目录一、概述二、DataTable 的用法1.创建表和列2.添加行3.取值和赋值4.删除行5.遍历 DataTable6.判断 DataTable 列中是否存在某个值7.设置主键8.获取 DataRow 所在的行号9.DataTable 转换为 List10.将 List 转 DataTable三、DataGridView 的用法1.绑定数据2.获取绑定的数据源3.获取 / 设置 选中单元格的数据4.设置单元格的宽高结束一、概述DataGridView 控件提供用于
- 【C#】c#Windows桌面程序退入托盘及右键菜单
- 一. 退出托盘功能窗体加组件notifyIcon修改属性,属性中加入要在托盘显示时呈现的图标。添加MouseClick事件编辑代码:private void Form_Main_FormClosing(object sender, FormClosingEventArgs e) { e.Cancel = true; this.Hid
- 【C#】C# 自动更新(基于FTP)
- 目录一、前言二、功能的实现1.本地黑名单2.读取配置文件3.读取 FTP 文件列表4.读取本地文件5.匹配更新6.版本的切换三、环境搭建四、常见问题2023.12.30 更新结束效果启动软件后,会自动读取所有的 FTP 服务器文件,然后读取本地需要更新的目录,进行匹配,将 FTP 服务器的文件同步到本地Winform 界面一、前言在去年,我写了一个 C# 版本的自动更新,这个是根据配置文件 + 网站文件等组成的框架,以实现本地文件的新增、替换和删除,虽然实现了自动更新的功能,但用起来过于复杂,代
- 【C#】C# Winfrom 右键菜单
- 目录一、概述二、新建 winform 项目三、给图片控件添加右键菜单四、给菜单添加点击事件五、测试结束一、概述ContextMenuStrip 是 Windows 窗体应用程序中的一个控件,它提供了一个弹出菜单,用于在用户右键单击控件或其他界面元素时显示上下文相关的选项。它通常用于在图形用户界面中提供快捷操作和功能。ContextMenuStrip 控件可以通过在 Visual Studio 的设计器中拖放方式添加到窗体上,或者通过编程方式创建和配置。它可以与其他控件(如按钮、文本框等
- 【C#】c#开发桌面应用程序用什么框架
- style="text-wrap: wrap;">在C#开发桌面应用程序时,可以使用以下几种常见的框架:</p><ol class=" list-paddingleft-2" style="width: 1529.1px; text-wrap: wrap;"><li><p>Windows Forms:这是一种由.NET Framework提供的GUI框架,它提供了丰富的GUI控件和易于使用的编程模型。Windows Forms在C#开发领域中使用非常广泛,并且已经存在多年,获得了广泛的支持和优化。</p></li></ol
- 【PHP】php如何将utf8转gbk编码
- 【AntDesignPro】Ant Design Pro学习记录—ModalForm的使用(四)
- 【数据库】MongoDB特点
- 【Python】利用Python脚本在Linux平台下实现任务调度与自动化
- 【JavaScript】JS四舍五入保留两位小数(一)
- 【Vue】前端框架 Vue3框架 使用总结(一) Vue框架的基础使用
- 【PHP】PHP中的堆和栈的概念及其应用
- 【Vue】Vue3 开发实战分享——打印插件 Print.js 的使用(Vue3 + Nodejs + Print.js 实战)以及 el-table 与 el-pagination 的深入使用(上)
- 【Python】SQLAlchemy继承与外部调用
- 【JavaScript】JS时间和时间戳互转