先上图看效果在说.

效果图如上,在Web中这个一点难度都没有,几行Css+JS就搞定了.但是在Winfrom中.本来就是半杯水的水准,想做这个个导航菜单,发现真难找,找了很多都不合胃口,只能自己写个了.现在基本功能完善,可根据系统设置的权限显示菜单,缺点和不足,添加菜单固定不能从数据库菜单表中直接读,根据用户权限显示菜单过于麻烦,在视图模式下,控件会有问题.发到这里以便共同学习和改善此控件。

步骤一:添加用户控件 例 在项目中添加UserControls文件夹-添加用户控件 NavBar

步骤二:在用户控件属性里设置其默认大小, 且添加个Panle 设置 Dock=Fill

步骤三:添加一个NarBarItem 类 此类为导航菜单的二级菜单

  1. /// <summary>
  2. /// 二级菜单的项
  3. /// </summary>
  4. public class NarBarItem : UserControl
  5. {
  6. public NarBarItem(string text,int ImageIndex)
  7. {
  8. this.Text = text;
  9. this.imageIndex = ImageIndex;
  10. }
  11.  
  12. /// <summary>
  13. /// 二级菜单的图片索引
  14. /// </summary>
  15. public int imageIndex
  16. {
  17. get;
  18. set;
  19. }
  20. }

步骤四:添加导航菜单的一级菜单类 ButtonGroup

  1. /// <summary>
  2. /// 导航栏中的导航条
  3. /// </summary>
  4. public class ButtonGroup : UserControl
  5. {
  6. /// <summary>
  7. /// 一级菜单的事件
  8. /// </summary>
  9. public event EventHandler TitleBarClick;
  10.  
  11. public event ButtonClickHander ImageButtonClick;
  12.  
  13. public ButtonGroup(string text)
  14. {
  15. Text = text;
  16. InitializeControl();
  17. #region 加载所有图标
  18. imageItem.Images.Add(Resources.group);
  19. imageItem.Images.Add(Resources.level);
  20. imageItem.Images.Add(Resources._lock);
  21. imageItem.Images.Add(Resources.keyboard);
  22. imageItem.Images.Add(Resources.kshop_hover);
  23. imageItem.Images.Add(Resources.list);
  24. imageItem.Images.Add(Resources.lorry_add);
  25. imageItem.Images.Add(Resources.mcard_mlist);
  26. imageItem.Images.Add(Resources.message);
  27. imageItem.Images.Add(Resources.mlist_hover);
  28. imageItem.Images.Add(Resources.mobile);
  29. imageItem.Images.Add(Resources.money);
  30. imageItem.Images.Add(Resources.mouse);
  31. imageItem.Images.Add(Resources.news);
  32. imageItem.Images.Add(Resources.news);
  33. imageItem.Images.Add(Resources.pc);
  34. imageItem.Images.Add(Resources.privilege);
  35. imageItem.Images.Add(Resources.prod);
  36. imageItem.Images.Add(Resources.product);
  37. imageItem.Images.Add(Resources.report);
  38. imageItem.Images.Add(Resources.shop);
  39. imageItem.Images.Add(Resources.shopping);
  40. imageItem.Images.Add(Resources.sms);
  41. imageItem.Images.Add(Resources.smstmp);
  42. imageItem.Images.Add(Resources.table);
  43. imageItem.Images.Add(Resources.table_excel);
  44. imageItem.Images.Add(Resources.telephone);
  45. imageItem.Images.Add(Resources.vcard_add);
  46. imageItem.Images.Add(Resources.weixin);
  47. imageItem.Images.Add(Resources.xtgg);
  48. #endregion
  49. LvArea.StateImageList = imageItem;
  50. LvArea.LargeImageList = imageItem;
  51. }
  52.  
  53. /// <summary>
  54. /// 初始化导航条
  55. /// </summary>
  56. private void InitializeControl()
  57. {
  58. //
  59. // 导航条上的标题栏
  60. //
  61. TitleBar.Cursor = Cursors.Hand;
  62. TitleBar.TextAlign = ContentAlignment.MiddleCenter;
  63. TitleBar.ForeColor = Color.FromArgb(, , );
  64. TitleBar.Location = , );
  65. TitleBar.Size = , );
  66. TitleBar.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D;
  67. TitleBar.BackgroundImage = Resources.img2;
  68. //顶级菜单按钮事件
  69. TitleBar.Click += new EventHandler(TitleBar_Click);
  70. //
  71. //ButtonGroup导航条
  72. //
  73. Width = ;
  74. Height = ;
  75. this.Controls.Add(TitleBar);
  76. this.Controls.Add(LvArea);
  77. }
  78.  
  79. /// <summary>
  80. /// 初始化菜单二级子项
  81. /// </summary>
  82. public void InitImageButtons(int ParentHeight,int ParentCount,List<MenuTable> GetCurrentMenuTable)
  83. {
  84. //获取菜单顶级控件的高度
  85. int imageButtonHeight = ParentHeight;
  86. //
  87. // 导航条上的面板区域(Panel)
  88. //
  89. LvArea.Location = , );
  90. //子面板的高度 等于顶级面板的高度-导航条的高度 30* 导航条的个数 高度不足则显示下拉框
  91. LvArea.Size = , imageButtonHeight - (ParentCount * ));
  92. LvArea.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D;
  93. LvArea.View = View.Tile;
  94. LvArea.SelectedIndexChanged += new EventHandler(LvArea_SelectedIndexChanged);
  95. // 导航条上的图片按钮
  96. //
  97. ListViewItem item = null;
  98. ; n < ImageButtons.Count; n++)
  99. {
  100. ).FirstOrDefault()!=null)
  101. {
  102. item = new ListViewItem(ImageButtons[n].Text, ImageButtons[n].imageIndex);
  103. LvArea.Items.Add(item);
  104. }
  105.  
  106. }
  107. LvArea.Scrollable = true;
  108. LvArea.Cursor = Cursors.Hand;
  109. }
  110.  
  111. private System.Windows.Forms.Label TitleBar = new System.Windows.Forms.Label();
  112. private ListView LvArea = new ListView();
  113. private ImageList imageItem = new ImageList();
  114.  
  115. /// <summary>
  116. /// 导航条上的标题栏的文字
  117. /// </summary>
  118. public new String Text
  119. {
  120. get
  121. {
  122. return TitleBar.Text;
  123. }
  124. set
  125. {
  126. TitleBar.Text = value;
  127. }
  128. }
  129.  
  130. public string tagText
  131. {
  132. get;
  133. set;
  134. }
  135. private List<NarBarItem> _ImageButtons = new List<NarBarItem>();
  136.  
  137. /// <summary>
  138. /// 导航条所包含或关联的二级菜单
  139. /// </summary>
  140. public List<NarBarItem> ImageButtons
  141. {
  142. get { return _ImageButtons; }
  143. set
  144. {
  145. _ImageButtons = value;
  146. }
  147. }
  148.  
  149. /// <summary>
  150. /// 单击导航条上的标题事件处理
  151. /// </summary>
  152. private void TitleBar_Click(object sender, EventArgs e)
  153. {
  154. if (TitleBarClick != null)
  155. {
  156. TitleBarClick(this, e);
  157. }
  158. }
  159.  
  160. /// <summary>
  161. /// 二级分类的点击事件
  162. /// </summary>
  163. /// <param name="sender"></param>
  164. /// <param name="e"></param>
  165. private void LvArea_SelectedIndexChanged(object sender, EventArgs e)
  166. {
  167. )
  168. {
  169. ListView.SelectedIndexCollection c = LvArea.SelectedIndices;
  170. tagText = LvArea.Items[c[]].Text;
  171. if (ImageButtonClick != null)
  172. {
  173. ImageButtonClick(sender, tagText);
  174. }
  175. }
  176. }
  177. }

步骤五:用户控件Cs 代码中相关的方法代码如下

  1. public partial class NavBar : UserControl
  2. {
  3. ;
  4. public NavBar()
  5. {
  6. InitializeComponent();
  7. int SH = Screen.PrimaryScreen.Bounds.Height;
  8. NavBarHeight = SH - ;
  9. InitNavBar(); // 初始化导航栏,该方法必须在NavButtonGroup重新调整后执行
  10.  
  11. }
  12.  
  13. /// <summary>
  14. /// 窗体改变大小后重新计算排版控件
  15. /// </summary>
  16. public void NarBarSizeChange()
  17. {
  18. int SH = Screen.PrimaryScreen.Bounds.Height;
  19. NavBarHeight = SH - ;
  20. ResetNavBar();
  21. }
  22.  
  23. #region 定义显示菜单
  24. /// <summary>
  25. /// 说明:导航栏初始的功能模块列表,可以通过定义此列表设置导航栏中的导航条及图片按扭。
  26. /// 注意:这里定义的是一个私有的List类型变量NavButtonGroup,并不是一个私有的函数方法。
  27. /// </summary>
  28. private List<NavBar.ButtonGroup> NavButtonGroup = new List<NavBar.ButtonGroup>()
  29. {
  30. new ButtonGroup("前台销售")
  31. {
  32. ImageButtons = new List<NarBarItem>()
  33. {
  34. ),
  35. ),
  36. ),
  37. ),
  38. ),
  39. }
  40. },
  41. new ButtonGroup("进货管理")
  42. {
  43. ImageButtons = new List<NarBarItem>()
  44. {
  45. ),
  46. ),
  47. }
  48. }
  49. ,
  50. new ButtonGroup("销售管理")
  51. {
  52. ImageButtons = new List<NarBarItem>()
  53. {
  54. ),
  55. ),
  56. }
  57. }
  58. ,
  59. new ButtonGroup("库存管理")
  60. {
  61. ImageButtons = new List<NarBarItem>()
  62. {
  63. ),
  64. ),
  65. ),
  66. }
  67. }
  68. ,
  69. new ButtonGroup("报表中心")
  70. {
  71. ImageButtons = new List<NarBarItem>()
  72. {
  73. ),
  74. ),
  75. ),
  76. ),
  77. ),
  78. ),
  79. ),
  80. ),
  81. ),
  82. ),
  83. }
  84. }
  85. ,
  86. new ButtonGroup("会员管理")
  87. {
  88. ImageButtons = new List<NarBarItem>()
  89. {
  90. ),
  91. ),
  92. ),
  93. ),
  94. ),
  95. }
  96. }
  97. ,
  98. new ButtonGroup("数据分析")
  99. {
  100. ImageButtons = new List<NarBarItem>()
  101. {
  102. ),
  103. ),
  104. ),
  105. ),
  106. ),
  107. ),
  108. ),
  109. }
  110. }
  111. ,
  112. new ButtonGroup("短信管理")
  113. {
  114. ImageButtons = new List<NarBarItem>()
  115. {
  116. ),
  117. ),
  118. ),
  119. ),
  120. }
  121. }
  122. ,
  123. new ButtonGroup("员工管理")
  124. {
  125. ImageButtons = new List<NarBarItem>()
  126. {
  127. ),
  128. ),
  129. ),
  130. ),
  131. }
  132. }
  133. ,
  134. new ButtonGroup("商品管理")
  135. {
  136. ImageButtons = new List<NarBarItem>()
  137. {
  138. ),
  139. ),
  140. ),
  141. ),
  142. }
  143. }
  144. ,
  145. new ButtonGroup("系统设置")
  146. {
  147. ImageButtons = new List<NarBarItem>()
  148. {
  149. ),
  150. ),
  151. ),
  152. ),
  153. }
  154. }
  155. ,
  156. new ButtonGroup("系统帮助")
  157. {
  158. ImageButtons = new List<NarBarItem>()
  159. {
  160. ),
  161. ),
  162. ),
  163. }
  164. }
  165. };
  166. #endregion
  167.  
  168. private List<MenuTable> GetCurrentUserMenuTable = new List<MenuTable>();
  169.  
  170. /// <summary>
  171. /// 取得当前用户的菜单权限
  172. /// </summary>
  173. private void GetCurrentUserMenu()
  174. {
  175. MenuBLL bll = new MenuBLL();
  176. List<MenuTable> getAllMenuTable = bll.ToList();
  177. List<MenuTable> getCurrentMenuTable = new List<MenuTable>();
  178. //绑定数据库所有的菜单
  179. if (Current.IsAdmin)
  180. {
  181. getCurrentMenuTable = getAllMenuTable.OrderBy(p => p.fOrder).ToList();
  182. GetCurrentUserMenuTable = getCurrentMenuTable;
  183. }
  184. else
  185. {
  186. //根据员工取得当前员工的菜单
  187. List<UsersPower> powerList = new UsersPowerBLL().ToList(Ugong.WinUtility.Utility.fCustID, Current.UserID);
  188. List<MenuTable> MenuList = new List<MenuTable>();
  189. MenuTable MenuModel = new MenuTable();
  190. foreach (UsersPower item in powerList)
  191. {
  192. MenuModel = getAllMenuTable.Where(p => p.fID == item.fMenuID).FirstOrDefault();
  193. if (MenuModel == null) continue;
  194. MenuList.Add(MenuModel);
  195. }
  196. getCurrentMenuTable = MenuList.OrderBy(p => p.fOrder).ToList();
  197. GetCurrentUserMenuTable = getCurrentMenuTable;
  198. }
  199.  
  200. //剔除当前用户没有的一级菜单
  201. MenuTable model = null;
  202. List<NavBar.ButtonGroup> temBtnGroup = new List<NavBar.ButtonGroup>();
  203. foreach (NavBar.ButtonGroup ul in NavButtonGroup)
  204. {
  205. model = getCurrentMenuTable.Where(p => p.fMenuName == ul.Text && p.fParentID == ).FirstOrDefault();
  206. if (model != null)
  207. {
  208. temBtnGroup.Add(ul);
  209. }
  210. }
  211.  
  212. NavButtonGroup = temBtnGroup;
  213. }
  214.  
  215. #region 导航栏类中的相关属性与方法
  216.  
  217. public delegate void ButtonClickHander(object sender, string targetModule);
  218.  
  219. /// <summary>
  220. /// 自定义从二级子项返回的委托
  221. /// </summary>
  222. /// <param name="sender"></param>
  223. /// <param name="targetModule"></param>
  224. public delegate void NavBarClikHander(object sender, string targetModule);
  225.  
  226. /// <summary>
  227. /// 自定义从二级子菜单返回的事件
  228. /// </summary>
  229. public event NavBarClikHander NavBarClick;
  230.  
  231. /// <summary>
  232. /// 退出
  233. /// </summary>
  234. public event EventHandler QuitSystemClick;
  235.  
  236. /// <summary>
  237. /// 初始化导航栏
  238. /// </summary>
  239. private void InitNavBar()
  240. {
  241. GetCurrentUserMenu();
  242. this.Dock = DockStyle.Fill;
  243. ; n < NavButtonGroup.Count; n++)
  244. {
  245. ButtonGroup buttonGroup = NavButtonGroup[n];
  246. buttonGroup.Left = ;
  247. buttonGroup.Tag = n;
  248. buttonGroup.TitleBarClick += new EventHandler(TitleBar_Click);
  249. buttonGroup.InitImageButtons(NavBarHeight, NavButtonGroup.Count,GetCurrentUserMenuTable); //初始化子控件
  250. buttonGroup.ImageButtonClick += new ButtonClickHander(buttonGroup_ImageButtonClick);
  251. PnlBackGround.Controls.Add(buttonGroup); //将菜单控件添加到用户模板的顶级控件中
  252. }
  253. //对控件进行布局
  254. ResetNavBar();
  255. }
  256.  
  257. /// <summary>
  258. /// 二级菜单事件升级到顶级事件
  259. /// </summary>
  260. /// <param name="sender"></param>
  261. /// <param name="targetModule"></param>
  262. void buttonGroup_ImageButtonClick(object sender, string targetModule)
  263. {
  264. if (NavBarClick != null)
  265. {
  266. NavBarClick(sender, targetModule);
  267. }
  268. }
  269.  
  270. /// <summary>
  271. /// 重新设置导航栏的布局。
  272. /// </summary>
  273. private void ResetNavBar()
  274. {
  275.  
  276. ;
  277. ; n < NavButtonGroup.Count; n++)
  278. {
  279. ButtonGroup buttonGroup = NavButtonGroup[n];
  280. if (n <= CurrentGroupIndex)
  281. {
  282. buttonGroup.Top = + n * barHeight;
  283. }
  284. else
  285. {
  286. buttonGroup.Top = PnlBackGround.Height - (NavButtonGroup.Count - n) * barHeight;
  287. }
  288. if (n == CurrentGroupIndex)
  289. {
  290. buttonGroup.Height = PnlBackGround.Height - (NavButtonGroup.Count - ) * barHeight;
  291. }
  292. else
  293. {
  294. buttonGroup.Height = barHeight;
  295. }
  296. }
  297. }
  298.  
  299. /// <summary>
  300. /// 导航条大小发生变更时,重新设置导航条的布局。
  301. /// </summary>
  302. private void NavBar_SizeChanged(object sender, EventArgs e)
  303. {
  304. ResetNavBar();
  305. }
  306.  
  307. /// <summary>
  308. /// 当前导航栏中选中的导航条编号
  309. /// </summary>
  310. ;
  311.  
  312. /// <summary>
  313. /// 导航栏中的导航条单击事件处理
  314. /// </summary>
  315. private void TitleBar_Click(object sender, EventArgs e)
  316. {
  317. if (sender is ButtonGroup)
  318. {
  319. ButtonGroup buttonGroup = (ButtonGroup)sender;
  320. if (buttonGroup.Text == "退出系统")
  321. {
  322. if (QuitSystemClick != null)
  323. {
  324. QuitSystemClick(buttonGroup, e);
  325. }
  326. return;
  327. }
  328. CurrentGroupIndex = (int)buttonGroup.Tag;
  329. ResetNavBar();
  330. }
  331. }
  332.  
  333. #endregion
  334. }

步骤六:在页面的调用方法

  1. public FrmMain2()
  2. {
  3. InitializeComponent();
  4. navBar1.NavBarClick += new UserControls.NavBar.NavBarClikHander(navBar1_NavBarClick);
  5. }
  6.  
  7. /// <summary>
  8. ///
  9. /// </summary>
  10. /// <param name="sender"></param>
  11. /// <param name="e"></param>
  12. private void FrmMain_Resize(object sender, EventArgs e)
  13. {
  14. navBar1.NarBarSizeChange();
  15. }
  16.  
  17. /// <summary>
  18. ///
  19. /// </summary>
  20. /// <param name="sender"></param>
  21. /// <param name="targetModule"></param>
  22. void navBar1_NavBarClick(object sender, string targetModule)
  23. {
  24. if (!string.IsNullOrEmpty(targetModule))
  25. {
  26. targetModule //
  27. }
  28. }

好了 帖出了全部代码就不用提供示例下载了.

Winfrom 开发系统导航菜单的更多相关文章

  1. SharePoint开发 - 自定义导航菜单(一)菜单声明与配置

    博客地址 http://blog.csdn.net/foxdave 本篇描述自定义sharepoint菜单的一种方式,自定义菜单适用于一些门户等需求的网站 自定义的菜单有自己的数据源,可以是数据表,可 ...

  2. netcore mvc快速开发系统(菜单,角色,权限[精确到按钮])开源

    AntMgr https://github.com/yuzd/AntMgr 基于netcore2.0 mvc 开发的 快速搭建具有如下特色的后台管理系统 特色: 用户管理 菜单管理 角色管理 权限管理 ...

  3. SharePoint开发 - 自定义导航菜单(二)母版页的菜单应用

    博客地址 http://blog.csdn.net/foxdave 接上篇点击打开链接 本篇叙述在母版页中应用之前的配置信息生成菜单,主要涉及到母版页的自定义,并应用了第三方控件库DevExpress ...

  4. SharePoint开发 - 自定义导航菜单(三)附其他代码

    博客地址 http://blog.csdn.net/foxdave 接上篇点击打开链接 LeftNavGroupTemplate.cs internal class LeftNavGroupTempl ...

  5. jquery实现的个人中心导航菜单

    之前为大家介绍了一款jquery和css3实现的很酷的菜单导航.这是一款由jquery开发的导航菜单.适合放在门户网站的个人用户中心后台.效果和美观都非常不错.我们先一起看看效果图: 在线预览   源 ...

  6. 5.JavaScript优化及导航菜单背后的秘密

    JavaScript优化及导航菜单背后的秘密 伍星 学习目标1.进一步了解前端优化 学习如何编写良好的 JavaScirpt2.通过导航的学习,了解JavaScirpt的应用 JavaScript在用 ...

  7. python测试开发django-41.crispy-forms设计标签式导航菜单(TabHolder)

    前言 xadmin的详情页面主要是用form_layout布局,学会了完全可以不用写html代码,也能做出很好看的页面. xadmin的html页面是用的Bootstrap3框架设计的,layout布 ...

  8. Web前端开发实战6:CSS实现导航菜单结合二级下拉式菜单的简单变换

    前面几篇博文都在讲导航菜单和二级下拉式菜单,事实上有非常多方法都能够实现的.详细的情况还要视情况而定. 在后面学习到jQuery框架之后,会有更丰富的动画效果.因为在学习Ajax和jQuery的初步阶 ...

  9. 使用jQuery开发iOS风格的页面导航菜单

    在线演示1 本地下载     申请达人,去除赞助商链接 iOS风格的操作系统和导航方式现在越来越流行,在今天的jQuery教程中,我们将介绍如何生成一个iphone风格的菜单导航. HTML代码 我们 ...

随机推荐

  1. Silverlight弹出层(转载)

    ChildWindow为Silverlight中的弹出子窗口 可以在项目新建子窗口文件: 相互传值: //父窗体向子窗体传值,需要在ChildWindow中构造函数进行传值ChildWindowTes ...

  2. JavaScript执行上下文

    变量声明.函数声明为何会提升?js执行时是如何查找变量的?JavaScript中最基本的部分——执行上下文(execution context) 什么是执行上下文? 当JavaScript代码运行,执 ...

  3. java基础知识回顾之java Thread类学习(六)--java多线程同步函数用的锁

    1.验证同步函数使用的锁----普通方法使用的锁 思路:创建两个线程,同时操作同一个资源,还是用卖票的例子来验证.创建好两个线程t1,t2,t1线程走同步代码块操作tickets,t2,线程走同步函数 ...

  4. Code::Blocks生成的EXE文件执行错误解决:The program can't start because libgcc_s_dw2-1.dll is missing

    想用C++弄个简单东东,看有没有可行性, 开发软件,微软的太大太肿,就选用了Code::Blocks. 测试HELLO时,在工程环境中没问题的,但生成的EXE执行有问题, 报什么 libgcc_s_d ...

  5. 29. 栈的push,pop序列

    题目:给定2个整数序列,其中1个是栈的push顺序,判断另一个有没有可能是对应的pop顺序 解:其实这题主要是判断进栈次数和出栈次数誓不是相等.我是用栈作的,效率不高,每一个元素最多出栈1次,进栈1此 ...

  6. hdu1020 Encoding

    http://acm.hdu.edu.cn/showproblem.php?pid=1020 过了的就是好孩子........ #include<stdio.h> #include< ...

  7. MAC OS JAVA环境变量配置

    在  /etc/profile 中 加上这些 #临时提权 sudo su #输入密码 vi /etc/profile #配置JAVA_HOME,此处路径根据自己的版本填写 JAVA_HOME=&quo ...

  8. kmalloc/kfree,vmalloc/vfree函数用法和区别

    http://blog.csdn.net/tigerjibo/article/details/6412881 kmalloc/kfree,vmalloc/vfree函数用法和区别 1.kmalloc ...

  9. c/c++优秀博文

    C进阶指南(1):整型溢出和类型提升.内存申请和管理 http://blog.jobbole.com/72830/ 软件开发中应避免的10个问题

  10. 发送消息执行记事本的“另存为”菜单功能(通过WM_COMMAND控制使用别的程序的菜单命令)

    发送消息执行记事本的“另存为”菜单功能procedure TForm1.FormCreate(Sender: TObject);var hNotepad: Cardinal;begin hNotepa ...