Winfrom 开发系统导航菜单

时间:2023-03-10 00:39:34
Winfrom 开发系统导航菜单

先上图看效果在说.

Winfrom 开发系统导航菜单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 //
            }
         }

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