五.Winform使用Webview2创建界面,配置Router管理界面窗体界面

2024-01-23 08:52

本文主要是介绍五.Winform使用Webview2创建界面,配置Router管理界面窗体界面,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Winform使用Webview2创建界面,配置Router管理界面窗体界面

  • 往期目录
  • Router的使用
    • 使用方法
    • 配置Router方法
    • RouterInfo 配置
  • Routers.cs代码文件和使用场景模拟
    • Routers.cs代码
    • RouterUtils.cs代码
    • 使用场景
      • 1.创建窗体程序
      • 2.在MainForm窗体上添加`FlowLayoutPanel`用来显示按钮
  • 往期目录

往期目录

专栏目录

Router的使用

便于窗口管理,使用统一的路由配置

使用方法

    //普通使用Form form= Routers.Utils.Push('Demo1');//对 form 做一些其他操作
    //定制使用//根据配置路由获取formForm form = Routers.Utils.CreateForm(routerInfo);//设置参数或添加事件form.MdiParent = _mainForm;form.WindowState = FormWindowState.Maximized;form.MinimizeBox = false;form.MaximizeBox = false;form.Load+=(object sender,EventArgs:e)=>{}....//根据路由配置显示窗口Routers.Utils.ShowForm(form,routerInfo);

配置Router方法

Router/Routers.cs中 找到List<RouterInfo> List 变量。设置变量

public static List<RouterInfo> List = new List<RouterInfo>() {//创建RouterInfo 对象new RouterInfo(){//窗口Name 必须唯一Name="Demo1",//窗口显示文字Text="Webview2 初始基本HTML展示,回车导航",//是否时多文档窗口//需要提前为父级多文档窗口设置 MDI//TIP 多文档窗口 和 模态窗口不能同时设置IsMdiContainer=true ,//模态窗口 IsShowDialog=true,//一个描述字段,通常不会使用Remake="描述字段",     //要显示的Form对象// FormAction方法和Form变量同时设置 会优先使用FormActionForm=new Demo1(), //Form 每次关闭只会隐藏窗口,并不会销毁FormAction=()=>new Demo1(), //FormAction每次打开都是一个新的窗口//Form 参数,会存储到Form 的 Tag变量中 Params=( new Dictionary<string, object>(){{ "test1","test2"}}),//Load事件 ,在窗体加载时触发。不会影响原事件Load=(object sender,EventArgs e) =>{MessageBox.Show("Demo1窗体加载了!");},},new RouterInfo(){.....},....
};

RouterInfo 配置

参数类型含义允许空参数返回值
NameString窗口Name 必须唯一N--
TextString窗口显示文字Y--
RemakeString描述字段Y--
ParamsDictionary<string, object>窗体参数Y--
FormForm要显示的Form对象Form|FormAction必须具备一个--
FormActionFormAction()=>{}要显示的Form对象,优先级高于Form参数Form|FormAction必须具备一个-Form
LoadEventHandler窗体加载事件,在窗体加载时触发。不会影响原事件Y-void

Routers.cs代码文件和使用场景模拟

创建 Router文件夹,下面创建Routers.cs和RouterUtils.cs文件

Routers.cs代码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Security.Cryptography;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Xml.Linq;namespace WinformWebview2.Router
{public class Routers{  //配置相关窗口信息,假如有一下窗口 Demo1 Demo2 Demo3_1 Demo3_2public static List<RouterInfo> List = new List<RouterInfo>() {new RouterInfo(){Name="Demo1",Text="Webview2 初始基本HTML展示,回车导航",Form=new Demo1(),Params=( new Dictionary<string, object>(){{ "test1","test2"}}),Load=(object sender,EventArgs e) =>{MessageBox.Show("Demo1窗体加载了!");},IsShowDialog=true, //模态窗口 },new RouterInfo(){Name="Demo2",Text="和WebView2 中HTML 和C#之间通信",//Form=new Demo2(),FormAction=()=>new Demo2(),//是否时多文档窗口//需要提前为父级多文档窗口设置 MDIIsMdiContainer=true ,//IsShowDialog=true, //模态窗口 //窗口加载Load=(object sender,EventArgs e) =>{MessageBox.Show("Demo2窗体加载了!");},},new RouterInfo(){Name="Demo3_1",Text="Demo3_1",Form=new Demo3_1(),},new RouterInfo(){Name="Demo3_2",Text="Demo3_2",Form=new Demo3_1(),},};public static RouterUtils Utils = new RouterUtils(List);}
}

通过配置进行集中管理窗体界面,后通过调用可以实现页面跳转。

RouterUtils.cs代码

using System.Collections.Generic;
using System.Windows.Forms;namespace WinformWebview2.Router
{public class RouterUtils{/// <summary>/// 保存路由/// </summary>public List<RouterInfo> RouteList;public Dictionary<string, RouterInfo> RouteMap = new Dictionary<string, RouterInfo>();public RouterUtils(List<RouterInfo> _RouteList){this.RouteList = _RouteList;///创建 key-value 便于快速查找_RouteList.ForEach((RouterInfo _route) =>{this.RouteMap.Add(_route.Name, _route);});}/// <summary>/// 获取路由/// </summary>/// <param name="RouteName">路由唯一标识</param>/// <returns></returns>public RouterInfo GetRouterInfo(string RouteName){if (this.RouteMap == null || this.RouteMap.Count <= 0){return null;}return this.RouteMap[RouteName];}#region 获取窗口public Form GetForm(RouterInfo routerInfo){if (routerInfo.FormAction != null){return routerInfo.FormAction();}return routerInfo.Form;}#endregion#region 路由跳转/// <summary>/// 路由跳转/// </summary>public Form Push(String RouteName){return this.Push(RouteName, null);}public Form Push(String RouteName, Dictionary<string, object> Params){RouterInfo routerInfo = this.GetRouterInfo(RouteName);return this.Push(routerInfo, Params);}public Form Push(RouterInfo routerInfo){return this.Push(routerInfo, null);}public Form Push(RouterInfo routerInfo, Dictionary<string, object> Params){Form form = this.CreateForm(routerInfo, Params);this.ShowForm(form, routerInfo);return form;}#endregion#region 创建窗口,设置相关参数public Form CreateForm(RouterInfo routerInfo){return this.CreateForm(routerInfo, null);}public Form CreateForm(RouterInfo routerInfo, Dictionary<string, object> Params){Form form = this.GetForm(routerInfo);form.Text = routerInfo.Text;form.Name = routerInfo.Name;///将form的params存在Tag中  form.Tag = Utils.Utils.MergeDic(Params, routerInfo.Params);if (routerInfo.Load != null){form.Load += (object sender, EventArgs e) =>{routerInfo.Load(sender, e);if (routerInfo.LoadingAfter != null){form = routerInfo.LoadingAfter(sender, e, form);}};}form.FormClosing += (object sender, FormClosingEventArgs e) =>{if (routerInfo.FormAction == null){form.Hide();e.Cancel = true;}};return form;}#endregion#region 显示窗口/// <summary>/// 显示窗口/// </summary>/// <param name="form"></param>/// <param name="isDialog"></param>public void ShowForm(Form form, RouterInfo routerInfo){this.ShowForm(form, routerInfo.IsShowDialog);}/// <summary>/// 显示窗口/// </summary>/// <param name="form"></param>/// <param name="isDialog"></param>public void ShowForm(Form form, bool isDialog){try {if (isDialog){form.ShowDialog();return;}form.Show();} catch(Exception exception) {MessageBox.Show(exception.Message.ToString());//非顶级窗体不能显示为模式对话框。在调用 showDialog 之前应从所有父窗体中移除该窗体。//出现以上错误说明:不能同时设置IsMdiContainer和IsShowDialog}}#endregion}public class RouterInfo{/// <summary>/// 路由Name 唯一标识/// </summary>public string Name;/// <summary>/// 路由地址相关窗口名称/// </summary>public string Text;/// <summary>/// 路由参数/// </summary>public Dictionary<string, object> Params;/// <summary>/// 路由对于的窗口/// </summary>public Form Form;/// <summary>///  路由对于的窗口 通过函数返回form ,这样在每次调用都可以创建一个新窗口/// </summary>/// <returns>Form</returns>public delegate Form FormActionHandler();public FormActionHandler FormAction;/// <summary>/// 是否多文档界面 TIP 需要自行进行关联/// 需要先设置多文档界面的父级窗口/// </summary>public bool IsMdiContainer;/ <summary>/ 多文档界面的父级窗口/ </summary>//public Form MdiParent;/// <summary>/// 是否模态显示/// </summary>public bool IsShowDialog;/// <summary>/// 描述/// </summary>public String Remake;/// <summary>/// 窗体的加载事件/// </summary>/// <returns></returns>public EventHandler Load;/// <summary>/// 在初始化完成后触发事件/// </summary>/// <param name="form"></param>/// <returns></returns>public delegate Form LoadingAfterAfterHandler(object sender, EventArgs e, Form form);public LoadingAfterAfterHandler LoadingAfter;}
}

使用场景

1.创建窗体程序

创建窗体Demo3_1,创建窗体Demo3_2

2.在MainForm窗体上添加FlowLayoutPanel用来显示按钮

  • 将之前的按钮删除掉,使用FlowLayoutPanel布局,设置DockTop
  • 在MainForm的构造函数中,通过代码创建button,并和Routers配置关联。
public MainForm(){InitializeComponent();//创建按钮和按钮事件并添加到FlowLayoutPanel控件上CreateButton();}/// <summary>/// 根据路由配置加载按钮/// </summary>public void CreateButton(){//设置MainForm多文档窗口,如果需要的话,不需要则注释Form _mainForm = this;//获取路由配置并遍历Routers.List.ForEach(routerInfo =>{//创建按钮Button button = new Button();button.Text = routerInfo.Text;button.Name = routerInfo.Name;button.Tag = routerInfo.Params;button.AutoSize = true;//设置按钮点击事件 点击打开窗口button.Click += (object sender, EventArgs e) =>{//根据情况判断要不要设置 多文档窗口if (routerInfo.IsMdiContainer){//多文档窗口我们需要获取到对于的form对象Form form = Routers.Utils.CreateForm(routerInfo);//设置Form窗口为多文档_mainForm.IsMdiContainer = true;form.MdiParent = _mainForm;                        //显示窗口 Routers.Utils.ShowForm(form,routerInfo);}else { Routers.Utils.Push(((Control)sender).Name);}};//添加到FlowLayoutPanel控件上flyFormPanel.Controls.Add(button);});}

往期目录

专栏目录

这篇关于五.Winform使用Webview2创建界面,配置Router管理界面窗体界面的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/635879

相关文章

C++类和对象之默认成员函数的使用解读

《C++类和对象之默认成员函数的使用解读》:本文主要介绍C++类和对象之默认成员函数的使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、默认成员函数有哪些二、各默认成员函数详解默认构造函数析构函数拷贝构造函数拷贝赋值运算符三、默认成员函数的注意事项总结一

使用Python和Matplotlib实现可视化字体轮廓(从路径数据到矢量图形)

《使用Python和Matplotlib实现可视化字体轮廓(从路径数据到矢量图形)》字体设计和矢量图形处理是编程中一个有趣且实用的领域,通过Python的matplotlib库,我们可以轻松将字体轮廓... 目录背景知识字体轮廓的表示实现步骤1. 安装依赖库2. 准备数据3. 解析路径指令4. 绘制图形关键

Windows 系统下 Nginx 的配置步骤详解

《Windows系统下Nginx的配置步骤详解》Nginx是一款功能强大的软件,在互联网领域有广泛应用,简单来说,它就像一个聪明的交通指挥员,能让网站运行得更高效、更稳定,:本文主要介绍W... 目录一、为什么要用 Nginx二、Windows 系统下 Nginx 的配置步骤1. 下载 Nginx2. 解压

VS配置好Qt环境之后但无法打开ui界面的问题解决

《VS配置好Qt环境之后但无法打开ui界面的问题解决》本文主要介绍了VS配置好Qt环境之后但无法打开ui界面的问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要... 目UKeLvb录找到Qt安装目录中designer.UKeLvBexe的路径找到vs中的解决方案资源

详解如何使用Python从零开始构建文本统计模型

《详解如何使用Python从零开始构建文本统计模型》在自然语言处理领域,词汇表构建是文本预处理的关键环节,本文通过Python代码实践,演示如何从原始文本中提取多尺度特征,并通过动态调整机制构建更精确... 目录一、项目背景与核心思想二、核心代码解析1. 数据加载与预处理2. 多尺度字符统计3. 统计结果可

Linux基础命令@grep、wc、管道符的使用详解

《Linux基础命令@grep、wc、管道符的使用详解》:本文主要介绍Linux基础命令@grep、wc、管道符的使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录grep概念语法作用演示一演示二演示三,带选项 -nwc概念语法作用wc,不带选项-c,统计字节数-

SpringCloud中的@FeignClient注解使用详解

《SpringCloud中的@FeignClient注解使用详解》在SpringCloud中使用Feign进行服务间的调用时,通常会使用@FeignClient注解来标记Feign客户端接口,这篇文章... 在Spring Cloud中使用Feign进行服务间的调用时,通常会使用@FeignClient注解

windows系统上如何进行maven安装和配置方式

《windows系统上如何进行maven安装和配置方式》:本文主要介绍windows系统上如何进行maven安装和配置方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不... 目录1. Maven 简介2. maven的下载与安装2.1 下载 Maven2.2 Maven安装2.

MySQL的ALTER TABLE命令的使用解读

《MySQL的ALTERTABLE命令的使用解读》:本文主要介绍MySQL的ALTERTABLE命令的使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、查看所建表的编China编程码格式2、修改表的编码格式3、修改列队数据类型4、添加列5、修改列的位置5.1、把列

Python使用FFmpeg实现高效音频格式转换工具

《Python使用FFmpeg实现高效音频格式转换工具》在数字音频处理领域,音频格式转换是一项基础但至关重要的功能,本文主要为大家介绍了Python如何使用FFmpeg实现强大功能的图形化音频转换工具... 目录概述功能详解软件效果展示主界面布局转换过程截图完成提示开发步骤详解1. 环境准备2. 项目功能结