几行代码搞定C#抽屉式导航菜单

lzguanghome 2019-10-24 10:00:53
加精
业余学过几年FoxPro,从未接触过C#,这几天心血来潮,想在C#中做一个抽屉式导航菜单,却被控件的Dock属性搞得晕头转向,经过一番摸索后终于成功了。当然,这只是一个雏形,新手可以看一下,也请各位高手莫笑话,并能提出改进意见,谢谢!
一、准备工作:
1、一个panel控件,命名为panel1;
2、若干button控件,分别命名为button1,button2, button3.....,高度全部为25(重要!一定要设成同样的高度!),TabIndex属性分别为0,1,2,3(非常重要!一定要从0开始按顺序递增,至于为什么,后面你自然明白),调整布局,如图一:
3、打开窗体的Designer.cs,从上至下修改为你想要的顺序,如button1,button2, button3,.....以此类推(非常重要!从上至下的顺序要与图一的布局完全一致,不能颠倒,至于为什么,你研究一下控件的Dock属性就明白了),如图二:



二、在button控件Click事件中写下以下代码:
int myHeight = 25;//假设Button高度为25,可自行定义,但要求全部同高
int myIndex = this.panel1.Controls.IndexOf((Button)sender);//获取当前控件索引
foreach (Control myButton in this.panel1.Controls)//遍历所有控件
{
if (myButton.TabIndex <= myIndex)
{
myButton.Dock = DockStyle.None;//先清除Dock属性(这一步很重要)
myButton.Top = myButton.TabIndex * myHeight;//重新定义Top值
}
else
{
myButton.Dock = DockStyle.Bottom;//设置Dock属性:置底
}
}
...全文
6755 42 打赏 收藏 转发到动态 举报
写回复
用AI写文章
42 条回复
切换为时间正序
请发表友善的回复…
发表回复
sgyiliya 2020-05-09
  • 打赏
  • 举报
回复
可能用dev控件是最方便的。 或者考虑用wpf实现。
奇点码农 2020-05-08
  • 打赏
  • 举报
回复
给楼主个思路,之前写的,就是自己选图片,利用pannel,pictureBox,label然后根据方法组中的按钮信息自动生成,点击展开和关闭的时候计算坐标是相对麻烦(思路清晰就很好算),还有就是初始坐标要获取form 的坐标
飞天凤凰601 2020-05-08
  • 打赏
  • 举报
回复
我直接使用Devexpress菜单,非常好用,样式也多 看看我的软件
Power IC2023 2020-05-07
  • 打赏
  • 举报
回复
嗯 不错。。。。
youke321zou 2020-04-07
  • 打赏
  • 举报
回复
很好很强大很不错的精华帖子
youke321zou 2020-04-07
  • 打赏
  • 举报
回复
很好很强大很不错的精华帖子
楠小南 2020-03-19
  • 打赏
  • 举报
回复
mirrorspace 2020-03-17
  • 打赏
  • 举报
回复
不错.搞起来
xxp2008 2020-03-17
  • 打赏
  • 举报
回复
感谢分享技术,给你推荐一下。
skil35 2020-03-12
  • 打赏
  • 举报
回复
感谢楼主分享
窝窝山大狗子 2020-01-18
  • 打赏
  • 举报
回复
我觉得还有优化的空间,特别是在新加入控件后,tabindex也会增加索引,此时排序就会出错。建议在每个按钮事件循环遍历的时候增加个判断,只循环Button控件的索引。另外,控件高度可以直接获得,不用写死。这样方便后续更改。其中某个按钮事件代码如下: int myHeight = ((Button)sender).Height;//假设Button高度为25,可自行定义,但要求全部同高 int myIndex = this.panel1.Controls.IndexOf((Button)sender);//获取当前控件索引 foreach (Control myButton in this.panel1.Controls)//遍历所有控件 { if (myButton is Button ) { if (myButton.TabIndex <= myIndex) { myButton.Dock = DockStyle.None;//先清除Dock属性(这一步很重要) myButton.Top = myButton.TabIndex * myHeight;//重新定义Top值 } else { myButton.Dock = DockStyle.Bottom;//设置Dock属性:置底 } } else { pictureBox1.Dock = DockStyle.None; pictureBox1.Top = ((Button)sender).Height + ((Button)sender).Top; } }
ilikeff8 2020-01-11
  • 打赏
  • 举报
回复
鼓励一下自己开发自定义控件的做法,不过如果商用推荐使用现成控件,devpress,或componentone,不要自己造轮子
XD_NML 2019-12-15
  • 打赏
  • 举报
回复 1
引用 5 楼 健者天行 的回复:
这么菜的,就不要推荐了。
你来分享技术或者讨论都挺好的,来说些废话硬当shax那就给爷爪巴
yanghanyuze 2019-12-15
  • 打赏
  • 举报
回复
不需要设置高度吧
qq_45939983 2019-12-09
  • 打赏
  • 举报
回复
先看看,谢谢分享
wilson1966 2019-11-13
  • 打赏
  • 举报
回复
老实讲,以实际操作来说,用tree 当导航控件比较好操作 因为,一点全部可操作的FORM 都出来了
大鱼> 2019-11-12
  • 打赏
  • 举报
回复
说真的对小白还是很有用的
xiaoxiaoxuea 2019-11-12
  • 打赏
  • 举报
回复
666666666
lzguanghome 2019-11-12
  • 打赏
  • 举报
回复
引用 30 楼 HyoJung 的回复:
说真的对小白还是很有用的

谢谢褒奖!本意就是给初学者看的哦。
加油馒头 2019-11-07
  • 打赏
  • 举报
回复
厉害了,技术分享
加载更多回复(22)

110,538

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧