先上图看效果在说.

效果图如上,在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 开发系统导航菜单的更多相关文章

  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. .net 对称加密DESCryptoServiceProvider

    1.生成密钥以加密和解密数据 DESCryptoServiceProvider 基于一种对称加密算法.对称加密需要密钥和初始化矢量 (IV) 来加密数据.要解密该数据,您必须拥有此同一密钥和 IV.您 ...

  2. XML 实体扩展攻击

    XMl Entity Expansion(攻击)某种程度上类似于 XML Entity Expansion,但是它主要试图通过消耗目标程序的服务器环境来进行DOS攻击的.这种攻击基于XML Entit ...

  3. Linq to EF 与Linq to Object 使用心得

    大家都知道Linq既可以用来查询数据库对象(我这里指的是Entity FrameWork里的Model对象),也可以用来查询内存中的IEnumerable对象. 两者单独查询时都不会出现什么问题,不过 ...

  4. 【面试题015】链表中倒数第k个结点

    [面试题015]链表中倒数第k个结点    可以用两个指针,当第一个指针指向了第k个时候,第二个指针让他指向链表的第一个元素,然后这两个指针同时向后面移动, 当第一个指针移动到末尾的时候,第二个指针指 ...

  5. POJ 3641

    Pseudoprime numbers Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 6044   Accepted: 24 ...

  6. JavaWeb项目开发案例精粹-第3章在线考试系统-003Dao层

    1. package com.sanqing.dao; import java.util.List; import com.sanqing.po.Student; public interface S ...

  7. Photoshop:建议设置

    一.新建文档设置: 二.对齐设置 菜单->视图->对齐->全部 使用图层.形状等操作时自动对齐网格,画矢量图不怕模糊边缘,确保每个像素保持清晰. 三.首选项设置 关掉"启用 ...

  8. *windows文件显示后缀名

  9. 机器学习 —— 概率图模型(Homework: Representation)

    前两周的作业主要是关于Factor以及有向图的构造,但是概率图模型中还有一种更强大的武器——双向图(无向图.Markov Network).与有向图不同,双向图可以描述两个var之间相互作用以及联系. ...

  10. MATLAB曲线绘制

    一. 二维数据曲线图1.1 绘制 单根二维曲线plot 函数的基本调用 格式为:plot(x,y) 其中x和y为长度相同的向量,分别用于存储x坐标 和y坐标数据. 例1-1 在0≤x≤2p区间内,绘制 ...