在好例子网,分享、交流、成长!
您当前所在位置:首页C# 开发实例C#语言基础 → C# 抽屉菜单实例(winform左侧导航菜单)

C# 抽屉菜单实例(winform左侧导航菜单)

C#语言基础

下载此实例
  • 开发语言:C#
  • 实例大小:0.39M
  • 下载次数:493
  • 浏览次数:16113
  • 发布时间:2016-05-13
  • 实例类别:C#语言基础
  • 发 布 人:gaokai747218
  • 文件格式:.rar
  • 所需积分:2
 相关标签: 菜单 C# 导航

实例介绍

【实例简介】

【实例截图】

【核心代码】

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using MyControls2008.Properties;
using System.Drawing.Design;

namespace MyControls2008
{
    public partial class ToolboxGroup : UserControl
    {
        public ToolboxGroup()
        {
            InitializeComponent();

            this.textBrush = new SolidBrush(this.ForeColor);
            this.textPointF = new PointF(19f, 3f);
            this.heightLarge = this.Height;
            this.heightSmall = this.Height;
            this.imageRec = new Rectangle(3, 3, 16, 16);
            this.rectangleColor未选中 = Color.FromArgb(206, 212, 223);
            this.rectangleColor选中 = Color.FromArgb(229, 195, 101);
            this.fillColor未选中上 = Color.FromArgb(240, 240, 240);
            this.fillColor未选中下 = Color.FromArgb(240, 240, 240);
            this.fillColor选中上 = Color.FromArgb(255, 249, 231);
            this.fillColor选中下 = Color.FromArgb(255, 242, 203);
            this.rectanglePen = new Pen(rectangleColor未选中);
            this.image展开前 = Resources.normal;
            this.image展开后 = Resources.launch;
            this.image = image展开前;
            this.fillBrush上 = new SolidBrush(fillColor未选中上);
            this.fillBrush下 = new SolidBrush(fillColor未选中下);
            this.itemSpace = 1;
            this.imageOffset = new Point(0, 1);

            this.ResetRec();

            展开StatusChanged  = new EventHandler(ToolboxGroup_展开StatusChanged);
            SelectStatusChanged  = new EventHandler(ToolboxGroup_SelectStatusChanged);
            OnItemsChanged  = new EventHandler(ToolboxGroup_OnItemsChanged);

            Res.Item2Group.Add(this.items, this);
        }

        #region 显示文本
        [Browsable(false)]
        private string text = "";

        [Browsable(false)]
        private Brush textBrush;

        [Browsable(false)]
        private PointF textPointF;

        [Browsable(true)]
        public override string Text
        {
            get
            {
                return base.Text;
            }
            set
            {
                base.Text = value;

                this.Showtext = base.Text;
            }
        }

        [Browsable(true),
        Category("扩展"),
        Description("显示文本变化时")]
        public event EventHandler OnShowtextChanged;

        [Browsable(true),
        Category("扩展"),
        Description("显示文本"),
        RefreshProperties(RefreshProperties.Repaint),
        NotifyParentProperty(true)]
        public string Showtext
        {
            get
            {
                return text;
            }
            set
            {
                text = value;
                if (OnShowtextChanged != null)
                    OnShowtextChanged.Invoke(this, new EventArgs());
                this.Invalidate();
            }
        }
        #endregion

        #region 文本偏移位置
        [Browsable(false)]
        private Point showtextOffset = new Point(0, 0);

        [Browsable(true),
        Category("扩展"),
        Description("文本偏移位置"),
        RefreshProperties(RefreshProperties.Repaint),
        NotifyParentProperty(true)]
        public Point ShowtextOffset
        {
            get
            {
                return showtextOffset;
            }
            set
            {
                showtextOffset = value;
                textPointF = new PointF(19f, 3f).Add(showtextOffset);
                this.Invalidate();
            }
        }
        #endregion

        #region 图标 展开前 展开后
        [Browsable(false)]
        private Image image展开前;
        [Browsable(false)]
        private Image image展开后;
        [Browsable(false)]
        private Image image;

        [Browsable(false)]
        private Rectangle imageRec;

        [Browsable(true),
        Category("扩展"),
        Description("图标 展开前"),
        RefreshProperties(RefreshProperties.Repaint),
        NotifyParentProperty(true)]
        public Image Image展开前
        {
            get
            {
                return image展开前;
            }
            set
            {
                image展开前 = value;
                if (!Is展开)
                    image = image展开前;
                this.Invalidate();
            }
        }

        [Browsable(true),
        Category("扩展"),
        Description("图标 展开后"),
        RefreshProperties(RefreshProperties.Repaint),
        NotifyParentProperty(true)]
        public Image Image展开后
        {
            get
            {
                return image展开后;
            }
            set
            {
                image展开后 = value;
                if (Is展开)
                    image = image展开后;
                this.Invalidate();
            }
        }
        #endregion

        #region 图片大小
        [Browsable(false)]
        private Size imageSize = new Size(16, 16);

        [Browsable(true),
        Category("扩展"),
        Description("图片大小"),
        RefreshProperties(RefreshProperties.Repaint),
        NotifyParentProperty(true)]
        public Size ImageSize
        {
            get
            {
                return imageSize;
            }
            set
            {
                imageSize = value;
                imageRec = new Rectangle(3, 3, 16, 16).Add(
                    imageOffset).ChangeWidthHeight(ImageSize);
                this.Invalidate();
            }
        }
        #endregion

        #region 图片偏移位置
        [Browsable(false)]
        private Point imageOffset = new Point(0, 0);

        [Browsable(true),
        Category("扩展"),
        Description("图片偏移位置"),
        RefreshProperties(RefreshProperties.Repaint),
        NotifyParentProperty(true)]
        public Point ImageOffset
        {
            get
            {
                return imageOffset;
            }
            set
            {
                imageOffset = value;
                imageRec = new Rectangle(3, 3, 16, 16).Add(
                    imageOffset).ChangeWidthHeight(ImageSize);
                this.Invalidate();
            }
        }
        #endregion

        #region 内置窗体大小 展开前 展开后
        [Browsable(false)]
        private int heightSmall;
        [Browsable(false)]
        private int HeightSmall
        {
            get
            {
                return heightSmall;
            }
            set
            {
                heightSmall = value;
                this.Invalidate();
            }
        }
        [Browsable(false)]
        private int heightLarge;
        [Browsable(false)]
        private int HeightLarge
        {
            get
            {
                return heightLarge;
            }
            set
            {
                heightLarge = value;
                this.Invalidate();
            }
        }
        [Browsable(true),
        Description("内置窗体大小 展开前,\n不要手工修改"),
        Category("扩展"),
        RefreshProperties(RefreshProperties.Repaint),
        NotifyParentProperty(true)]
        public Size SizeSmall
        {
            get
            {
                return new Size(this.Width, this.HeightSmall);
            }
            set
            {
                this.Width = value.Width;
                this.HeightSmall = value.Height;
                this.ResetRec();
                this.Invalidate();
            }
        }
        [Browsable(true),
        Description("内置窗体大小 展开后,\n不要手工修改"),
        Category("扩展"),
        RefreshProperties(RefreshProperties.Repaint),
        NotifyParentProperty(true)]
        public Size SizeLarge
        {
            get
            {
                return new Size(this.Width, this.HeightLarge);
            }
            set
            {
                this.Width = value.Width;
                this.HeightLarge = value.Height;
                this.ResetRec();
                this.Invalidate();
            }
        }

        private void ResetRec()
        {
            this.rectangleRec = new Rectangle(
                0,
                0,
                this.Width - 1,
                this.HeightSmall - 1);

            this.fillRec上 = new Rectangle(
                1,
                1,
                this.Width - 2,
                this.HeightSmall / 2);

            this.fillRec下 = new Rectangle(
                1,
                1   this.HeightSmall / 2,
                this.Width - 2,
                this.HeightSmall - 2 - this.HeightSmall / 2);

            this.ResetAllItems();
        }
        #endregion

        #region 控件框颜色 选中前 选中后
        [Browsable(false)]
        private Color rectangleColor未选中;
        [Browsable(false)]
        private Color rectangleColor选中;

        [Browsable(false)]
        private Pen rectanglePen;

        [Browsable(false)]
        private Rectangle rectangleRec;

        [Browsable(true),
        Category("扩展"),
        Description("控件框颜色 是否选中"),
        RefreshProperties(RefreshProperties.Repaint),
        NotifyParentProperty(true)]
        public Color RectangleColor未选中
        {
            get
            {
                return rectangleColor未选中;
            }
            set
            {
                rectangleColor未选中 = value;
                if (!IsSelect) {
                    rectanglePen = new Pen(rectangleColor未选中);
                }
                this.Invalidate();
            }
        }

        [Browsable(true),
        Category("扩展"),
        Description("控件框颜色 展开后"),
        RefreshProperties(RefreshProperties.Repaint),
        NotifyParentProperty(true)]
        public Color RectangleColor选中
        {
            get
            {
                return rectangleColor选中;
            }
            set
            {
                rectangleColor选中 = value;
                if (IsSelect) {
                    rectanglePen = new Pen(rectangleColor选中);
                }
                this.Invalidate();
            }
        }
        #endregion

        #region 背景颜色 上下 选中 未选中
        [Browsable(false)]
        private Color fillColor未选中上;
        [Browsable(false)]
        private Color fillColor未选中下;
        [Browsable(false)]
        private Color fillColor选中上;
        [Browsable(false)]
        private Color fillColor选中下;

        [Browsable(false)]
        private Brush fillBrush上;
        [Browsable(false)]
        private Brush fillBrush下;

        [Browsable(false)]
        private Rectangle fillRec上;
        [Browsable(false)]
        private Rectangle fillRec下;

        [Browsable(true),
        Category("扩展"),
        Description("背景 展开前上"),
        RefreshProperties(RefreshProperties.Repaint),
        NotifyParentProperty(true)]
        public Color FillColor展开前上
        {
            get
            {
                return fillColor未选中上;
            }
            set
            {
                fillColor未选中上 = value;
                if (!IsSelect)
                    this.fillBrush上 = new SolidBrush(this.fillColor未选中上);
                this.Invalidate();
            }
        }

        [Browsable(true),
        Category("扩展"),
        Description("背景 展开前下"),
        RefreshProperties(RefreshProperties.Repaint),
        NotifyParentProperty(true)]
        public Color FillColor展开前下
        {
            get
            {
                return fillColor未选中下;
            }
            set
            {
                fillColor未选中下 = value;
                if (!IsSelect)
                    this.fillBrush下 = new SolidBrush(this.fillColor未选中下);
                this.Invalidate();
            }
        }

        [Browsable(true),
        Category("扩展"),
        Description("背景 展开后上"),
        RefreshProperties(RefreshProperties.Repaint),
        NotifyParentProperty(true)]
        public Color FillColor展开后上
        {
            get
            {
                return fillColor选中上;
            }
            set
            {
                fillColor选中上 = value;
                if (IsSelect)
                    this.fillBrush上 = new SolidBrush(this.fillColor选中上);
                this.Invalidate();
            }
        }

        [Browsable(true),
        Category("扩展"),
        Description("背景 展开后下"),
        RefreshProperties(RefreshProperties.Repaint),
        NotifyParentProperty(true)]
        public Color FillColor展开后下
        {
            get
            {
                return fillColor选中下;
            }
            set
            {
                fillColor选中下 = value;
                if (IsSelect)
                    this.fillBrush下 = new SolidBrush(this.fillColor选中下);
                this.Invalidate();
            }
        }
        #endregion

        #region is展开 展开
        [Browsable(false)]
        private bool is展开 = false;

        [Browsable(true),
        Category("扩展"),
        Description("是否展开状态改变时")]
        public event EventHandler 展开StatusChanged;

        [Browsable(true),
        Category("扩展"),
        Description("是否展开状态"),
        RefreshProperties(RefreshProperties.Repaint),
        NotifyParentProperty(true)]
        public bool Is展开
        {
            get
            {
                return is展开;
            }
            set
            {
                is展开 = value;
                if (展开StatusChanged != null)
                    展开StatusChanged.Invoke(this, new EventArgs());
                this.Invalidate();
            }
        }
        #endregion

        #region isSelect 控件是否被选中
        [Browsable(false)]
        private bool isSelect = false;

        [Browsable(true),
        Category("扩展"),
        Description("控件是否被选中状态改变时")]
        public event EventHandler SelectStatusChanged;

        [Browsable(true),
        Category("扩展"),
        Description("控件是否被选中"),
        RefreshProperties(RefreshProperties.Repaint),
        NotifyParentProperty(true)]
        public bool IsSelect
        {
            get
            {
                return isSelect;
            }
            set
            {
                isSelect = value;
                if (SelectStatusChanged != null)
                    SelectStatusChanged.Invoke(this, new EventArgs());
                this.Invalidate();
            }
        }
        #endregion

        #region 控件间隔
        [Browsable(false)]
        private int itemSpace;

        [Browsable(true),
        Category("扩展"),
        Description("控件是否被选中"),
        RefreshProperties(RefreshProperties.Repaint),
        NotifyParentProperty(true)]
        public int ItemSpace
        {
            get
            {
                return itemSpace;
            }
            set
            {
                itemSpace = value;
                this.ResetAllItems();
                this.Invalidate();
            }
        }
        #endregion

        #region Group子项Items集合
        [Browsable(false)]
        private List<ToolboxItem> items = new List<ToolboxItem>();

        public event EventHandler OnItemsChanged;

        [Category("扩展"),
        Description("Group子项Items集合"),
        DesignerSerializationVisibility(DesignerSerializationVisibility.Content),
        Editor(typeof(ToolboxItemCollection), typeof(UITypeEditor)),
        RefreshProperties(RefreshProperties.All),
        NotifyParentProperty(true)]
        public List<ToolboxItem> Items
        {
            get
            {
                return items;
            }
        }
        #endregion

        #region ToolboxGroup_OnItemsChanged
        public void Raise_ItemsChanged()
        {
            if (OnItemsChanged != null)
                OnItemsChanged.Invoke(this, new EventArgs());
        }

        void ToolboxGroup_OnItemsChanged(object sender, EventArgs e)
        {
            ResetAllItems();

            this.Is展开 = true;
        }

        public void ResetAllItems()
        {
            int count = this.Items.Count;
            count = this.Items.Count;
            this.Controls.Clear();

            int newHeight = this.HeightSmall;

            for (int i = 0; i < count; i  ) {

                newHeight  = this.itemSpace   this.Items[i].Height;
                this.Items[i].Location = new Point(0, newHeight - this.Items[i].Height);
                this.Items[i].Width = this.Width;
                this.Items[i].IsSelect = false;
                this.Items[i].Parent = this;
            }

            this.HeightLarge = newHeight;
        }
        #endregion

        #region OnFontChanged
        protected override void OnFontChanged(EventArgs e)
        {
            //base.OnFontChanged(e);
            this.Invalidate();
        }
        #endregion

        #region OnForeColorChanged
        protected override void OnForeColorChanged(EventArgs e)
        {
            base.OnForeColorChanged(e);

            this.textBrush = new SolidBrush(this.ForeColor);
            this.Invalidate();
        }
        #endregion

        #region ToolboxGroup_展开StatusChanged
        protected void ToolboxGroup_展开StatusChanged(object sender, EventArgs e)
        {
            if (Is展开) {
                image = Image展开后;
                this.Height = this.HeightLarge;
            }
            else {
                image = Image展开前;
                this.Height = this.HeightSmall;

                int count = this.items.Count;
                for (int i = 0; i < count; i  ) {
                    this.items[i].IsSelect = false;
                }
            }
        }
        #endregion

        #region ToolboxGroup_SelectStatusChanged
        protected void ToolboxGroup_SelectStatusChanged(object sender, EventArgs e)
        {
            if (IsSelect) {
                rectanglePen = new Pen(rectangleColor选中);
                this.fillBrush上 = new SolidBrush(this.fillColor选中上);
                this.fillBrush下 = new SolidBrush(this.fillColor选中下);
            }
            else {
                rectanglePen = new Pen(rectangleColor未选中);
                this.fillBrush上 = new SolidBrush(this.fillColor未选中上);
                this.fillBrush下 = new SolidBrush(this.fillColor未选中下);
            }
        }
        #endregion

        #region OnMouseDown
        protected override void OnMouseDown(MouseEventArgs e)
        {
            base.OnMouseDown(e);

            if (e.Y <= this.HeightSmall) {
                this.IsSelect = true;
                this.Is展开 = !this.Is展开;

                Toolbox t = this.Parent as Toolbox;
                if (t != null) {
                    t.ForItem_ItemIsSelect(this);
                }
            }
        }
        #endregion

        #region OnSizeChanged
        protected override void OnSizeChanged(EventArgs e)
        {
            base.OnSizeChanged(e);

            if (!this.Is展开) {
                this.HeightSmall = this.Height;
                this.ResetAllItems();
            }
            else {
                this.HeightSmall = this.Height - this.Items.Sum(x => x.Height   this.ItemSpace);
                this.ResetAllItems();
            }

            this.ResetRec();

            this.Invalidate();
        }
        #endregion

        #region  重绘
        protected override void OnPaint(PaintEventArgs e)
        {
            if (this.isRepaint) {
                base.OnPaint(e);
                this.NewPaint(e);
            }
        }

        private void NewPaint(PaintEventArgs e)
        {
            using (BufferedGraphics Buf = Res.Context.Allocate(e.Graphics, e.ClipRectangle)) {

                Graphics g = Buf.Graphics;
                g.Clear(this.BackColor);

                g.DrawRectangle(rectanglePen, rectangleRec);

                g.FillRectangle(fillBrush上, fillRec上);
                g.FillRectangle(fillBrush下, fillRec下);

                g.DrawImage(image, imageRec);
                g.DrawString(this.Showtext, this.Font, textBrush, textPointF);

                Buf.Render(e.Graphics);
                g.Dispose();
            }
        }
        #endregion

        #region FOR SUNITEM 当点击Group子项时发生(改变Group为未选中状态)
        public void ForItem_ItemIsSelect(ToolboxItem item)
        {
            this.IsSelect = false;
            int count = this.items.Count;

            for (int i = 0; i < count; i  ) {
                if (this.items[i] != item)
                    this.items[i].IsSelect = false;
            }

            Toolbox t = this.Parent as Toolbox;
            if (t != null) {
                t.ForItem_ItemIsSelect(this);
            }
        }
        #endregion

        public bool isRepaint = true;
    }

    #region 支持集合编辑器
    public class ToolboxGroupCollection
        : System.ComponentModel.Design.CollectionEditor
    {
        public ToolboxGroupCollection(Type type)
            : base(type)
        {
        }

        protected override bool CanSelectMultipleInstances()
        {
            return false;
        }

        protected override object CreateInstance(Type itemType)
        {
            Res.isGroupCreate = true;
            return base.CreateInstance(itemType);
        }

        protected override object SetItems(object editValue, object[] value)
        {
            try {
                return base.SetItems(editValue, value);
            }
            finally {
                if (Res.isGroupCreate) {
                    Res.isGroupCreate = false;
                }
                else {
                    List<ToolboxGroup> obj = (List<ToolboxGroup>)editValue;
                    ((Toolbox)Res.Group2Toolbox[obj]).Raise_GroupsChanged();
                }
            }
        }

        protected override Type CreateCollectionItemType()
        {
            return typeof(ToolboxGroup);
        }
    }
    #endregion
}

标签: 菜单 C# 导航

实例下载地址

C# 抽屉菜单实例(winform左侧导航菜单)

不能下载?内容有错? 点击这里报错 + 投诉 + 提问

好例子网口号:伸出你的我的手 — 分享

网友评论

第 1 楼 依楼听雨声 发表于: 2016-12-22 08:56 42
无法使用,还被扣了积分

支持(0) 盖楼(回复)

第 2 楼 依楼听雨声 发表于: 2016-12-22 09:04 07
无法使用,还被扣了积分

支持(0) 盖楼(回复)

第 3 楼 依楼听雨声 发表于: 2016-12-22 09:04 09
无法使用,还被扣了积分

支持(0) 盖楼(回复)

第 4 楼 chkdsofeihosie 发表于: 2017-04-03 16:39 22
动态添加的显示不出来

支持(0) 盖楼(回复)

第 5 楼 hjx2325211 发表于: 2022-08-07 13:26 16
是的,无法动态加载

支持(0) 盖楼(回复)

第 6 楼 罗乙飞 发表于: 2024-02-28 10:30 19
动态代码添加Item是无法实现的,显示不了。这个有坑

支持(0) 盖楼(回复)

发表评论

(您的评论需要经过审核才能显示)

查看所有7条评论>>

小贴士

感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。

  • 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
  • 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
  • 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
  • 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。

关于好例子网

本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明

;
报警