您的当前位置:首页>全部文章>文章详情

【C#】Winform NanUI 0.77版本 读取嵌入式资源

CrazyPanda发表于:2024-02-06 20:47:15浏览:370次TAG:

引入NanUI框架


20210129140851680.png

这三个组件都要引入了,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的解释:

20210129140851680.png

关于内存不停增加的问题,主界面和页面1进行不停的切换,内存可以达到一个G以上,并且还可以不停的继续上涨,我初步怀疑是因为插件所用的工厂模式,不停的new一个类,而系统并没有释放内存,具体原因我没有验证。

20210129140851680.png

=========================================

案例:

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>

项目:

20210129140851680.png

将View里面的资源全部改为嵌入式资源

20210129140851680.png

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 的类和方法。调试支
发表于:2024-02-18 浏览:342 TAG:
【C#】C# Winform 多个程序之间的通信(非Scoket)
效果功能:打开窗体自动连接主程序,并自动添加到列表,可以向子程序群发消息可以向单个程序单独发送消息在退出程序后,添加的程序列表会自动移除一、概述参考:C# Winfrom程序之间通讯_c# sendmessege copydatastruct 返回多个值_熊思宇的博客-CSDN博客在之前我写过 winform 程序与程序之间的通信,但是这个版本有个问题,那就是只能由两个程序进行通信,同时打开多个程序的话,接收方收到的数据就会一模一样,这次发表这个教程,也就是要解决这个问题。归根结底,还是&amp;nbs
发表于:2024-02-03 浏览:295 TAG:
【C#】C#的DateTimePicker控件(日期控件)
目录一、使用DateTimePicker控件显示时间二、使用DateTimePicker控件以自定义格式显示日期三、返回DateTimePicker控件中选择的日期1.源码2.生成效果&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DateTimePicker控件(日期控件)用于选择日期和时间,DateTimePicker控件只能选择一个时间,而不是连续的时间段,也可以直接输入日期和时间。一、使用DateTimePicker控件显示时间&nbsp;
发表于:2024-01-29 浏览:382 TAG:
【C#】C# Winform DataGridView 控件和 DataTable
目录一、概述二、DataTable 的用法1.创建表和列2.添加行3.取值和赋值4.删除行5.遍历 DataTable6.判断 DataTable 列中是否存在某个值7.设置主键8.获取&nbsp;DataRow 所在的行号9.DataTable 转换为 List10.将 List 转&nbsp;DataTable三、DataGridView 的用法1.绑定数据2.获取绑定的数据源3.获取 / 设置&nbsp;选中单元格的数据4.设置单元格的宽高结束一、概述DataGridView 控件提供用于
发表于:2024-02-04 浏览:360 TAG:
【C#】c#Windows桌面程序退入托盘及右键菜单
一. 退出托盘功能窗体加组件notifyIcon修改属性,属性中加入要在托盘显示时呈现的图标。添加MouseClick事件编辑代码:private&nbsp;void&nbsp;Form_Main_FormClosing(object&nbsp;sender,&nbsp;FormClosingEventArgs&nbsp;e) { &nbsp;&nbsp;&nbsp;&nbsp;e.Cancel&nbsp;=&nbsp;true; &nbsp;&nbsp;&nbsp;&nbsp;this.Hid
发表于:2024-01-28 浏览:391 TAG:
【C#】C# 自动更新(基于FTP)
目录一、前言二、功能的实现1.本地黑名单2.读取配置文件3.读取 FTP 文件列表4.读取本地文件5.匹配更新6.版本的切换三、环境搭建四、常见问题2023.12.30 更新结束效果启动软件后,会自动读取所有的 FTP 服务器文件,然后读取本地需要更新的目录,进行匹配,将 FTP 服务器的文件同步到本地Winform 界面一、前言在去年,我写了一个 C# 版本的自动更新,这个是根据配置文件 + 网站文件等组成的框架,以实现本地文件的新增、替换和删除,虽然实现了自动更新的功能,但用起来过于复杂,代
发表于:2024-02-03 浏览:342 TAG:
【C#】C# Winfrom 右键菜单
目录一、概述二、新建&nbsp;winform 项目三、给图片控件添加右键菜单四、给菜单添加点击事件五、测试结束一、概述ContextMenuStrip 是 Windows 窗体应用程序中的一个控件,它提供了一个弹出菜单,用于在用户右键单击控件或其他界面元素时显示上下文相关的选项。它通常用于在图形用户界面中提供快捷操作和功能。ContextMenuStrip 控件可以通过在 Visual Studio 的设计器中拖放方式添加到窗体上,或者通过编程方式创建和配置。它可以与其他控件(如按钮、文本框等
发表于:2024-02-02 浏览:354 TAG:
【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
发表于:2024-01-27 浏览:443 TAG:
【C#】Winform NanUI 0.77版本 JS和C#相互调用
目录一、导入插件二、常用方法三、C#和JS相互调用1.C# 调用JS2.JS调用C#方法3.完整版C#代码4.完整版JS代码结束一、导入插件用的NanUI版本0.77参考官方地址:https://docs.formium.net/zh-hans/tutorial/first-app.html二、常用方法基础代码:using&nbsp;NetDimension.NanUI; using&nbsp;NetDimension.NanUI.Browser; &nbsp; class&nbsp;MainW
发表于:2024-02-06 浏览:384 TAG:
【C#】Winform NanUI 0.88版本 JS和C#相互调用
目录一、需求版本二、实例JS调用C#注册的只读属性JS调用C#注册的字段JS调用C#注册的同步方法JS调用C#注册的异步方法C#注册一个方法,JS调用并传递参数C#注册一个方法,JS调用并接收C#返回值C#注册一个方法,接收JS的数组参数C#注册一个方法,接收JS的一个函数,执行这个JS函数,并将C#的值传递过去三、结束一、需求在软件的界面和软件逻辑分离后,最重要的就是要处理参数的传递,和函数的调用,因此存在JS中和C#相互调用的需求。版本NanUI 版本:0.8.80.191二、实例using
发表于:2024-02-06 浏览:370 TAG: