Winform.Navigator是适用于Winform框架的页面导航器,这里的“页面”可以是一个Form窗体,也可以是继承自Control类的用户控件。
Nuget:https://www.nuget.org/packages/Winform.Navigator GitHub:https://github.com/hlz2516/Winform.Navigator
推荐在nuget管理器中直接搜索Winform.Navigator进行安装。
Winform.Navigator包中有两个主要的导航类,一个为Navigator,另一个为Router,它们均支持以下功能:
以下是它们不同的地方:
我在公司做第一个有点规模的工业类winform项目时,发现页面切换功能不够完善,造成了页面管理混乱的问题。之后我找了下第三方的多页面框架比如SunnyUI, 发现有些需求还是难以实现,因此我开发了Winform.Navigator,Winform.Navigator只基于Winform,因此不需要依赖任何第三方包,它只负责实现多页面框架的基础功能, 因此如果你想要找那种好看的多页面框架,可能这个包不是很适合你。
当你使用时,请选择以下其中一个使用
添加Navigator控件到容器中 打开工具箱,找到Navigator,将其拖至页面容器中,如图所示: 红色方框部分就是Navigator控件
设置程序使用者身份/权限。(可选,如果你需要简单的鉴权机制的话)
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Navigator.EnableAuthority = true; //是否开启鉴权属性,默认false(关闭)
Navigator.Navigator.SetRole(Navigator.Authority.VISITOR | Navigator.Authority.USER); //这一步是在设置程序使用者角色为游客+普通用户
Application.Run(new Form1());
}
SetRole方法不一定非要写在Main方法中,也可以写在主窗体构造时,只需要注意,一定要在默认页面显示前(如果有默认页面)或切换页面前调用,因为每次切换到新页面时都会做鉴权操作
public partial class Page1 : Form,IPage
{
public string Path { get; set; } //Router中才会用到
public bool Cached { get; set; } //设置该页面是否缓存
public Authority Authority { get; set; } = Authority.VISITOR; //设置该页面访问权限,如果你开启了鉴权的话,每次跳转到该页面会使用这里的权限属性与使用者角色权限进行比较,如果页面权限与使用者权限没有交集,那么会触发权限不符合事件
...
public void Pause() //该方法会在切换到其他页面时触发
{
}
public void Restore() //该方法会在切换回该页面时并且设置了缓存后触发
{
}
public void Reset() //该方法会在切换回该页面时并且设置了不缓存后触发
{
}
}
private void Form1_Load(object sender, EventArgs e)
{
//把继承了IPage的窗口类向导航器注册
navigator1.RegisterPage<Page1>();
navigator1.RegisterPage<Page2>(true); //注册时可设置默认页面
}
private void button1_Click(object sender, EventArgs e)
{
navigator1.NavigateTo<Page1>();
}
private void button2_Click(object sender, EventArgs e)
{
navigator1.NavigateTo<Page2>();
}
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7.2" />
</startup>
<!--step 1:configure the routes here-->
<routes>
<route defaultPage="true">
<path>/page-jump/page1</path>
<name>jumpPage1</name>
</route>
<route>
<path>/page-jump/page2</path>
</route>
</routes>
</configuration>
关于routes配置的更多规则,请看最后
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Router.LoadConfig(); //step 2:load the config from step1
Application.Run(new TestForm1());
}
public TestForm1()
{
InitializeComponent();
Router.SetContainer(panel1); //step 3:set page container
}
/**
* step 4: Inherit the IPage interface and add the Route feature to the class which used as page.
*/
[Route("/page-jump/page1")]
public partial class Page11 : Form,IPage
{
public string Path { get; set; }
public bool Cached { get; set; }
public Authority Authority { get; set; }
public Page11()
{
InitializeComponent();
}
public void Pause()
{
}
public void Restore()
{
}
public void Reset()
{
}
}
private void button1_Click(object sender, System.EventArgs e)
{
Router.RouteTo("/page-jump/page1"); //step 5: call RouteTo to route
}
private void button2_Click(object sender, System.EventArgs e)
{
var paramMap = new Dictionary<string, object>();
paramMap.Add("TestParam", "It's test word");
Router.RouteTo("jumpPage2", paramMap); //you can route with params
}
更多例子可参考仓库中的demo项目代码,demo分为demo-navigator和demo-router两个项目,其中demo-navigator中多为中文注释,demo-router中多为英文注释。
<routes enableAuthority="true">
...
</routes>
<route defaultPage="true">
<path>/page-jump/page1</path>
<name>jumpPage1</name>
</route>
cache
类别:项属性
释义:是否将该页面缓存
值:true/false,默认false
path
类别:子节点
释义:该页面的路由路径
值:自定义
备注:该项为必填项
name
类别:子节点
释义:该页面的路由名
值:自定义
备注:该项为可选项
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。