業余學過幾年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屬性:置底
}
}
uj5u.com熱心網友回復:
感謝分享技術,給你推薦一下。
uj5u.com熱心網友回復:
謝謝!
uj5u.com熱心網友回復:
uj5u.com熱心網友回復:
C#好學嗎 我也想入坑uj5u.com熱心網友回復:
這么菜的,就不要推薦了。uj5u.com熱心網友回復:
大概這樣子吧
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Windows.Forms;
namespace Test_1
{
public partial class Form1 : Form
{
private int select_num = 0;
public class Drawer
{
public string btn_text;
public int btn_height;
public int content_height;
public Control control; // 里面放置組件
public Drawer(string text,int bh, int ch,Control cl)
{
btn_text = text;
btn_height = bh;
content_height = ch;
control = cl;
}
}
public static List<Drawer> drawers = new List<Drawer>();
public void DrawerMenu(Control parent, Point point, BorderStyle borderStyle, Color bcolor, Size size )
{
Panel panel_box = new Panel() { Size = size, BackColor = bcolor };
for (int i= drawers.Count-1; i>-1;i--)
{
Panel panel_control = new Panel() { Dock = DockStyle.Top, Name = "window_" + i, BackColor = Color.SteelBlue };
panel_box.Controls.Add(panel_control);
if (i == 0) panel_control.Visible = true;
else panel_control.Visible = false;
panel_control.Controls.Add(drawers[i].control);
Button button = new Button() { Dock = DockStyle.Top, Height = drawers[i].btn_height,Text = drawers[i].btn_text,Tag = i };
button.Click += Button_Click;
panel_box.Controls.Add(button);
}
parent.Controls.Add(panel_box);
}
private void Button_Click(object sender, EventArgs e)
{
Control pL = (Control)sender;
if (select_num != (int)pL.Tag)
{
pL.Parent.Controls["window_" + select_num].Visible = false;
pL.Parent.Controls["window_" + (int)pL.Tag].Visible = true;
select_num = (int)pL.Tag;
}
}
public Form1()
{
InitializeComponent();
drawers.Add(new Drawer("Button_1",25,35,null));
drawers.Add(new Drawer("Button_2", 25, 35, null));
drawers.Add(new Drawer("Button_3", 25, 35, null));
drawers.Add(new Drawer("Button_4", 25, 35, null));
DrawerMenu(this, new Point(30,30), BorderStyle.FixedSingle, Color.White, new Size(200, 300));
}
}
}
uj5u.com熱心網友回復:
朋友,任何高手都是從菜鳥過來的,沒有人天生就懂!我才學了3天C#,又是業余的,自然沒你們功底好。真正的高手從來都是謙虛的,你永遠不知道明天或者后天,以前讓你看不上眼的菜鳥會甩你幾條街!如果你覺得那段代碼不好,你完全可以寫個更好給大家分享一下啊。
uj5u.com熱心網友回復:
挺好的,雖然我也不會C#
uj5u.com熱心網友回復:
不錯,我也是業余學習的
uj5u.com熱心網友回復:
謝謝兩位支持!其實我個人覺得那幾行代碼還是可行的。這幾天我看了許多網友為了實作類似的效果,有的代碼很多,有的用了第三方控制元件。期待有大腕能用更簡單、高效的方法放出來讓我們這些新人學習一下。
uj5u.com熱心網友回復:
不錯,我也是業余學習的uj5u.com熱心網友回復:
感謝分享,有點實力uj5u.com熱心網友回復:
6666666666牛叉uj5u.com熱心網友回復:
6666666666uj5u.com熱心網友回復:
學習了學習了學習了學習了學習了學習了uj5u.com熱心網友回復:
uj5u.com熱心網友回復:
https://www.haolizi.net/example/view_7669.html 給你推薦一個uj5u.com熱心網友回復:
這個牛!!感謝推薦!
uj5u.com熱心網友回復:
掌聲鼓勵鼓勵uj5u.com熱心網友回復:
這個牛!!感謝推薦!
uj5u.com熱心網友回復:
可以,很好
uj5u.com熱心網友回復:
不需要設定高度吧uj5u.com熱心網友回復:
厲害了,技術分享uj5u.com熱心網友回復:
666666666uj5u.com熱心網友回復:
說真的對小白還是很有用的uj5u.com熱心網友回復:
謝謝褒獎!本意就是給初學者看的哦。
uj5u.com熱心網友回復:
老實講,以實際操作來說,用tree 當導航控制元件比較好操作因為,一點全部可操作的FORM 都出來了
uj5u.com熱心網友回復:
先看看,謝謝分享uj5u.com熱心網友回復:
不需要設定高度吧uj5u.com熱心網友回復:
你來分享技識訓者討論都挺好的,來說些廢話硬當shax那就給爺爪巴uj5u.com熱心網友回復:
鼓勵一下自己開發自定義控制元件的做法,不過如果商用推薦使用現成控制元件,devpress,或componentone,不要自己造輪子uj5u.com熱心網友回復:
我覺得還有優化的空間,特別是在新加入控制元件后,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;
}
}
uj5u.com熱心網友回復:
感謝樓主分享uj5u.com熱心網友回復:
感謝分享技術,給你推薦一下。uj5u.com熱心網友回復:
不錯.搞起來uj5u.com熱心網友回復:
uj5u.com熱心網友回復:
很好很強大很不錯的精華帖子uj5u.com熱心網友回復:
很好很強大很不錯的精華帖子uj5u.com熱心網友回復:
嗯 不錯。。。。uj5u.com熱心網友回復:
給樓主個思路,之前寫的,就是自己選圖片,利用pannel,pictureBox,label然后根據方法組中的按鈕資訊自動生成,點擊展開和關閉的時候計算坐標是相對麻煩(思路清晰就很好算),還有就是初始坐標要獲取form 的坐標uj5u.com熱心網友回復:
我直接使用Devexpress選單,非常好用,樣式也多
看看我的軟體
uj5u.com熱心網友回復:
可能用dev控制元件是最方便的。或者考慮用wpf實作。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/43158.html
標籤:C#
上一篇:年齡真的是職業生涯的障礙
