Winfrom 开发系统导航菜单
先上图看效果在说.
效果图如上,在Web中这个一点难度都没有,几行Css+JS就搞定了.但是在Winfrom中.本来就是半杯水的水准,想做这个个导航菜单,发现真难找,找了很多都不合胃口,只能自己写个了.现在基本功能完善,可根据系统设置的权限显示菜单,缺点和不足,添加菜单固定不能从数据库菜单表中直接读,根据用户权限显示菜单过于麻烦,在视图模式下,控件会有问题.发到这里以便共同学习和改善此控件。
步骤一:添加用户控件 例 在项目中添加UserControls文件夹-添加用户控件 NavBar
步骤二:在用户控件属性里设置其默认大小, 且添加个Panle 设置 Dock=Fill
步骤三:添加一个NarBarItem 类 此类为导航菜单的二级菜单
/// <summary> /// 二级菜单的项 /// </summary> public class NarBarItem : UserControl { public NarBarItem(string text,int ImageIndex) { this.Text = text; this.imageIndex = ImageIndex; } /// <summary> /// 二级菜单的图片索引 /// </summary> public int imageIndex { get; set; } }
步骤四:添加导航菜单的一级菜单类 ButtonGroup
/// <summary> /// 导航栏中的导航条 /// </summary> public class ButtonGroup : UserControl { /// <summary> /// 一级菜单的事件 /// </summary> public event EventHandler TitleBarClick; public event ButtonClickHander ImageButtonClick; public ButtonGroup(string text) { Text = text; InitializeControl(); #region 加载所有图标 imageItem.Images.Add(Resources.group); imageItem.Images.Add(Resources.level); imageItem.Images.Add(Resources._lock); imageItem.Images.Add(Resources.keyboard); imageItem.Images.Add(Resources.kshop_hover); imageItem.Images.Add(Resources.list); imageItem.Images.Add(Resources.lorry_add); imageItem.Images.Add(Resources.mcard_mlist); imageItem.Images.Add(Resources.message); imageItem.Images.Add(Resources.mlist_hover); imageItem.Images.Add(Resources.mobile); imageItem.Images.Add(Resources.money); imageItem.Images.Add(Resources.mouse); imageItem.Images.Add(Resources.news); imageItem.Images.Add(Resources.news); imageItem.Images.Add(Resources.pc); imageItem.Images.Add(Resources.privilege); imageItem.Images.Add(Resources.prod); imageItem.Images.Add(Resources.product); imageItem.Images.Add(Resources.report); imageItem.Images.Add(Resources.shop); imageItem.Images.Add(Resources.shopping); imageItem.Images.Add(Resources.sms); imageItem.Images.Add(Resources.smstmp); imageItem.Images.Add(Resources.table); imageItem.Images.Add(Resources.table_excel); imageItem.Images.Add(Resources.telephone); imageItem.Images.Add(Resources.vcard_add); imageItem.Images.Add(Resources.weixin); imageItem.Images.Add(Resources.xtgg); #endregion LvArea.StateImageList = imageItem; LvArea.LargeImageList = imageItem; } /// <summary> /// 初始化导航条 /// </summary> private void InitializeControl() { // // 导航条上的标题栏 // TitleBar.Cursor = Cursors.Hand; TitleBar.TextAlign = ContentAlignment.MiddleCenter; TitleBar.ForeColor = Color.FromArgb(, , ); TitleBar.Location = , ); TitleBar.Size = , ); TitleBar.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D; TitleBar.BackgroundImage = Resources.img2; //顶级菜单按钮事件 TitleBar.Click += new EventHandler(TitleBar_Click); // //ButtonGroup导航条 // Width = ; Height = ; this.Controls.Add(TitleBar); this.Controls.Add(LvArea); } /// <summary> /// 初始化菜单二级子项 /// </summary> public void InitImageButtons(int ParentHeight,int ParentCount,List<MenuTable> GetCurrentMenuTable) { //获取菜单顶级控件的高度 int imageButtonHeight = ParentHeight; // // 导航条上的面板区域(Panel) // LvArea.Location = , ); //子面板的高度 等于顶级面板的高度-导航条的高度 30* 导航条的个数 高度不足则显示下拉框 LvArea.Size = , imageButtonHeight - (ParentCount * )); LvArea.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D; LvArea.View = View.Tile; LvArea.SelectedIndexChanged += new EventHandler(LvArea_SelectedIndexChanged); // 导航条上的图片按钮 // ListViewItem item = null; ; n < ImageButtons.Count; n++) { ).FirstOrDefault()!=null) { item = new ListViewItem(ImageButtons[n].Text, ImageButtons[n].imageIndex); LvArea.Items.Add(item); } } LvArea.Scrollable = true; LvArea.Cursor = Cursors.Hand; } private System.Windows.Forms.Label TitleBar = new System.Windows.Forms.Label(); private ListView LvArea = new ListView(); private ImageList imageItem = new ImageList(); /// <summary> /// 导航条上的标题栏的文字 /// </summary> public new String Text { get { return TitleBar.Text; } set { TitleBar.Text = value; } } public string tagText { get; set; } private List<NarBarItem> _ImageButtons = new List<NarBarItem>(); /// <summary> /// 导航条所包含或关联的二级菜单 /// </summary> public List<NarBarItem> ImageButtons { get { return _ImageButtons; } set { _ImageButtons = value; } } /// <summary> /// 单击导航条上的标题事件处理 /// </summary> private void TitleBar_Click(object sender, EventArgs e) { if (TitleBarClick != null) { TitleBarClick(this, e); } } /// <summary> /// 二级分类的点击事件 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void LvArea_SelectedIndexChanged(object sender, EventArgs e) { ) { ListView.SelectedIndexCollection c = LvArea.SelectedIndices; tagText = LvArea.Items[c[]].Text; if (ImageButtonClick != null) { ImageButtonClick(sender, tagText); } } } }
步骤五:用户控件Cs 代码中相关的方法代码如下
public partial class NavBar : UserControl { ; public NavBar() { InitializeComponent(); int SH = Screen.PrimaryScreen.Bounds.Height; NavBarHeight = SH - ; InitNavBar(); // 初始化导航栏,该方法必须在NavButtonGroup重新调整后执行 } /// <summary> /// 窗体改变大小后重新计算排版控件 /// </summary> public void NarBarSizeChange() { int SH = Screen.PrimaryScreen.Bounds.Height; NavBarHeight = SH - ; ResetNavBar(); } #region 定义显示菜单 /// <summary> /// 说明:导航栏初始的功能模块列表,可以通过定义此列表设置导航栏中的导航条及图片按扭。 /// 注意:这里定义的是一个私有的List类型变量NavButtonGroup,并不是一个私有的函数方法。 /// </summary> private List<NavBar.ButtonGroup> NavButtonGroup = new List<NavBar.ButtonGroup>() { new ButtonGroup("前台销售") { ImageButtons = new List<NarBarItem>() { ), ), ), ), ), } }, new ButtonGroup("进货管理") { ImageButtons = new List<NarBarItem>() { ), ), } } , new ButtonGroup("销售管理") { ImageButtons = new List<NarBarItem>() { ), ), } } , new ButtonGroup("库存管理") { ImageButtons = new List<NarBarItem>() { ), ), ), } } , new ButtonGroup("报表中心") { ImageButtons = new List<NarBarItem>() { ), ), ), ), ), ), ), ), ), ), } } , new ButtonGroup("会员管理") { ImageButtons = new List<NarBarItem>() { ), ), ), ), ), } } , new ButtonGroup("数据分析") { ImageButtons = new List<NarBarItem>() { ), ), ), ), ), ), ), } } , new ButtonGroup("短信管理") { ImageButtons = new List<NarBarItem>() { ), ), ), ), } } , new ButtonGroup("员工管理") { ImageButtons = new List<NarBarItem>() { ), ), ), ), } } , new ButtonGroup("商品管理") { ImageButtons = new List<NarBarItem>() { ), ), ), ), } } , new ButtonGroup("系统设置") { ImageButtons = new List<NarBarItem>() { ), ), ), ), } } , new ButtonGroup("系统帮助") { ImageButtons = new List<NarBarItem>() { ), ), ), } } }; #endregion private List<MenuTable> GetCurrentUserMenuTable = new List<MenuTable>(); /// <summary> /// 取得当前用户的菜单权限 /// </summary> private void GetCurrentUserMenu() { MenuBLL bll = new MenuBLL(); List<MenuTable> getAllMenuTable = bll.ToList(); List<MenuTable> getCurrentMenuTable = new List<MenuTable>(); //绑定数据库所有的菜单 if (Current.IsAdmin) { getCurrentMenuTable = getAllMenuTable.OrderBy(p => p.fOrder).ToList(); GetCurrentUserMenuTable = getCurrentMenuTable; } else { //根据员工取得当前员工的菜单 List<UsersPower> powerList = new UsersPowerBLL().ToList(Ugong.WinUtility.Utility.fCustID, Current.UserID); List<MenuTable> MenuList = new List<MenuTable>(); MenuTable MenuModel = new MenuTable(); foreach (UsersPower item in powerList) { MenuModel = getAllMenuTable.Where(p => p.fID == item.fMenuID).FirstOrDefault(); if (MenuModel == null) continue; MenuList.Add(MenuModel); } getCurrentMenuTable = MenuList.OrderBy(p => p.fOrder).ToList(); GetCurrentUserMenuTable = getCurrentMenuTable; } //剔除当前用户没有的一级菜单 MenuTable model = null; List<NavBar.ButtonGroup> temBtnGroup = new List<NavBar.ButtonGroup>(); foreach (NavBar.ButtonGroup ul in NavButtonGroup) { model = getCurrentMenuTable.Where(p => p.fMenuName == ul.Text && p.fParentID == ).FirstOrDefault(); if (model != null) { temBtnGroup.Add(ul); } } NavButtonGroup = temBtnGroup; } #region 导航栏类中的相关属性与方法 public delegate void ButtonClickHander(object sender, string targetModule); /// <summary> /// 自定义从二级子项返回的委托 /// </summary> /// <param name="sender"></param> /// <param name="targetModule"></param> public delegate void NavBarClikHander(object sender, string targetModule); /// <summary> /// 自定义从二级子菜单返回的事件 /// </summary> public event NavBarClikHander NavBarClick; /// <summary> /// 退出 /// </summary> public event EventHandler QuitSystemClick; /// <summary> /// 初始化导航栏 /// </summary> private void InitNavBar() { GetCurrentUserMenu(); this.Dock = DockStyle.Fill; ; n < NavButtonGroup.Count; n++) { ButtonGroup buttonGroup = NavButtonGroup[n]; buttonGroup.Left = ; buttonGroup.Tag = n; buttonGroup.TitleBarClick += new EventHandler(TitleBar_Click); buttonGroup.InitImageButtons(NavBarHeight, NavButtonGroup.Count,GetCurrentUserMenuTable); //初始化子控件 buttonGroup.ImageButtonClick += new ButtonClickHander(buttonGroup_ImageButtonClick); PnlBackGround.Controls.Add(buttonGroup); //将菜单控件添加到用户模板的顶级控件中 } //对控件进行布局 ResetNavBar(); } /// <summary> /// 二级菜单事件升级到顶级事件 /// </summary> /// <param name="sender"></param> /// <param name="targetModule"></param> void buttonGroup_ImageButtonClick(object sender, string targetModule) { if (NavBarClick != null) { NavBarClick(sender, targetModule); } } /// <summary> /// 重新设置导航栏的布局。 /// </summary> private void ResetNavBar() { ; ; n < NavButtonGroup.Count; n++) { ButtonGroup buttonGroup = NavButtonGroup[n]; if (n <= CurrentGroupIndex) { buttonGroup.Top = + n * barHeight; } else { buttonGroup.Top = PnlBackGround.Height - (NavButtonGroup.Count - n) * barHeight; } if (n == CurrentGroupIndex) { buttonGroup.Height = PnlBackGround.Height - (NavButtonGroup.Count - ) * barHeight; } else { buttonGroup.Height = barHeight; } } } /// <summary> /// 导航条大小发生变更时,重新设置导航条的布局。 /// </summary> private void NavBar_SizeChanged(object sender, EventArgs e) { ResetNavBar(); } /// <summary> /// 当前导航栏中选中的导航条编号 /// </summary> ; /// <summary> /// 导航栏中的导航条单击事件处理 /// </summary> private void TitleBar_Click(object sender, EventArgs e) { if (sender is ButtonGroup) { ButtonGroup buttonGroup = (ButtonGroup)sender; if (buttonGroup.Text == "退出系统") { if (QuitSystemClick != null) { QuitSystemClick(buttonGroup, e); } return; } CurrentGroupIndex = (int)buttonGroup.Tag; ResetNavBar(); } } #endregion }
步骤六:在页面的调用方法
public FrmMain2() { InitializeComponent(); navBar1.NavBarClick += new UserControls.NavBar.NavBarClikHander(navBar1_NavBarClick); } /// <summary> /// /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void FrmMain_Resize(object sender, EventArgs e) { navBar1.NarBarSizeChange(); } /// <summary> /// /// </summary> /// <param name="sender"></param> /// <param name="targetModule"></param> void navBar1_NavBarClick(object sender, string targetModule) { if (!string.IsNullOrEmpty(targetModule)) { targetModule // } }
好了 帖出了全部代码就不用提供示例下载了.
Winfrom 开发系统导航菜单的更多相关文章
- SharePoint开发 - 自定义导航菜单(一)菜单声明与配置
博客地址 http://blog.csdn.net/foxdave 本篇描述自定义sharepoint菜单的一种方式,自定义菜单适用于一些门户等需求的网站 自定义的菜单有自己的数据源,可以是数据表,可 ...
- netcore mvc快速开发系统(菜单,角色,权限[精确到按钮])开源
AntMgr https://github.com/yuzd/AntMgr 基于netcore2.0 mvc 开发的 快速搭建具有如下特色的后台管理系统 特色: 用户管理 菜单管理 角色管理 权限管理 ...
- SharePoint开发 - 自定义导航菜单(二)母版页的菜单应用
博客地址 http://blog.csdn.net/foxdave 接上篇点击打开链接 本篇叙述在母版页中应用之前的配置信息生成菜单,主要涉及到母版页的自定义,并应用了第三方控件库DevExpress ...
- SharePoint开发 - 自定义导航菜单(三)附其他代码
博客地址 http://blog.csdn.net/foxdave 接上篇点击打开链接 LeftNavGroupTemplate.cs internal class LeftNavGroupTempl ...
- jquery实现的个人中心导航菜单
之前为大家介绍了一款jquery和css3实现的很酷的菜单导航.这是一款由jquery开发的导航菜单.适合放在门户网站的个人用户中心后台.效果和美观都非常不错.我们先一起看看效果图: 在线预览 源 ...
- 5.JavaScript优化及导航菜单背后的秘密
JavaScript优化及导航菜单背后的秘密 伍星 学习目标1.进一步了解前端优化 学习如何编写良好的 JavaScirpt2.通过导航的学习,了解JavaScirpt的应用 JavaScript在用 ...
- python测试开发django-41.crispy-forms设计标签式导航菜单(TabHolder)
前言 xadmin的详情页面主要是用form_layout布局,学会了完全可以不用写html代码,也能做出很好看的页面. xadmin的html页面是用的Bootstrap3框架设计的,layout布 ...
- Web前端开发实战6:CSS实现导航菜单结合二级下拉式菜单的简单变换
前面几篇博文都在讲导航菜单和二级下拉式菜单,事实上有非常多方法都能够实现的.详细的情况还要视情况而定. 在后面学习到jQuery框架之后,会有更丰富的动画效果.因为在学习Ajax和jQuery的初步阶 ...
- 使用jQuery开发iOS风格的页面导航菜单
在线演示1 本地下载 申请达人,去除赞助商链接 iOS风格的操作系统和导航方式现在越来越流行,在今天的jQuery教程中,我们将介绍如何生成一个iphone风格的菜单导航. HTML代码 我们 ...
随机推荐
- 使用mysql触发器脚本,解决流水数据的添加。
1.建立表脚本 CREATE DATABASE `spring` DEFAULT CHARACTER SET utf8; USE `spring`; CREATE TABLE `account` ( ...
- 一个碉堡的swing类
今天遇到一个掉了一笔的swing类.可以完美的解决JFrame下设置背景的问题.任意size.太掉了.特记于此 import java.awt.*; import java.awt.image.Buf ...
- java基础知识回顾之java Socket学习(二)--TCP协议编程
TCP传输(传输控制协议):TCP协议是一种面向连接的,可靠的字节流服务.当客户端和服务器端彼此交换数据前,必须先在双方之间建立一个TCP连接,之后才能进行数据的传输.它将一台主机发出的字节流无差错的 ...
- java基础知识回顾之---java String final类普通方法的应用之字符串数组排序
/* * 1,给定一个字符串数组.按照字典顺序进行从小到大的排序. * {"nba","abc","cba","zz", ...
- POJ 3318 Matrix Multiplication(矩阵乘法)
题目链接 题意 : 给你三个n维矩阵,让你判断A*B是否等于C. 思路 :优化将二维转化成一维的.随机生成一个一维向量d,使得A*(B*d)=C*d,多次生成多次测试即可使错误概率大大减小. #inc ...
- cojs 白树黑 黑树白 题解报告
黑树白 首先如果不是强制在线,这个题用莫队+树状数组就可以在O(n*sqrt(n)*log(n))的时间内搞定 如果没有修改操作,可以直接上主席树就可以辣 我们考虑修改操作,某一个修改操作对于某一个查 ...
- lintcode 中等题: reverse linked list II 翻转链表II
题目 翻转链表 II 翻转链表中第m个节点到第n个节点的部分 样例 给出链表1->2->3->4->5->null, m = 2 和n = 4,返回1->4-> ...
- 单例模式与Android
http://blog.csdn.net/ljianhui/article/details/29275655 多线程下的单例模式是不安全的 Android中的单例模式 Android中存在着大量的单例 ...
- IOS中实现图片点击全屏预览
//// ViewController.m// XWZoomImageView//// Created by xiao on 15/11/13.// Copyright © 2015年 xiao. A ...
- Maven中心仓库
当你使用Maven构建一个项目,Maven会检查你的pom.xml文件,找出需要下载的依赖包.首先它会到本地仓库查找所需的文件,如果没找到,就到默认的中心仓库(这是新的http://search.ma ...