.net虽然不是专门用来做桌面程序的,但是它提供了丰富的winform程序控件,使得.net用来做桌面应用程序也非常方便。.net的界面配置工具在做winform界面时很方便,但是一直以来都习惯了对控件的拖拉,可视化修改其属性,双击添加事件代码。但是这种界面编辑方式有一个最大的限制那就是程序界面基本上就定格在拖拉出来的这些控件上,想根据具体情况来显示不同的界面,那就必须要用代码动态生成。下面这些代码是一个动态生成界面的程序的一部分:
protected void NewTabPage( string pageText )
{
TabPage tabPage = new TabPage();
tabPage.Text = pageText;
tabPage.Size = new System.Drawing.Size(800,600);
Bitmap bitmap = new Bitmap(@"./main.jpg");
tabPage.BackgroundImage = bitmap;
int[] xPos = {0,0,0,0,620,620,620,620};
int[] yPos = {182,282,382,482,182,282,382,482};
Bitmap buttonBitmap = new Bitmap(@"./main_but.gif");
Bitmap smallbuttonbmp = new Bitmap(@"./smallmain_but.gif");
for(int index=1; index < 9; index++)
{
Button button = new Button();
button.FlatStyle = FlatStyle.Popup;
button.BackgroundImage = buttonBitmap;
button.ForeColor = Color.Yellow;
button.ContextMenu = this.contextMenu3;
button.Location = new System.Drawing.Point(xPos[index-1], yPos[index-1]);
button.Size = new System.Drawing.Size(176, 49);
button.Name = "button" + index.ToString();
button.Text = "button" + index.ToString();
button.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
button.Click += new System.EventHandler(this.button_Click);
button.MouseMove += new MouseEventHandler(this.button_MouseMove);
tabPage.Controls.Add(button);
}
int[] posY = {208, 280,352,440};
int[] sizeX = {48,48,48,80,184,184,184,184};
string[] str = {"Url","TimeOut","Title","DisplayItems"};
for(int index=0; index < 4; index ++)
{
Label label = new Label();
label.Image = buttonBitmap;
label.Location = new System.Drawing.Point(270, posY[index]);
label.Size = new System.Drawing.Size(sizeX[index], 14);
label.Text = str[index];
label.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
tabPage.Controls.Add(label);
TextBox textBox = new TextBox();
textBox.BorderStyle = BorderStyle.None;
textBox.Location = new System.Drawing.Point(320, posY[index]);
textBox.Size = new System.Drawing.Size(sizeX[index+4], 21);
textBox.Name = "textBox" + index.ToString();
textBox.Text = "";
textBox.KeyDown += new System.Windows.Forms.KeyEventHandler(this.textBox_KeyDown);
tabPage.Controls.Add(textBox);
//绘制打开DisplayItems详细信息的按钮
if (index==3)
{
Button btn_DItems=new Button();
btn_DItems.Location=new System.Drawing.Point(320+sizeX[index+4]+10,posY[index]);
btn_DItems.Size=new System.Drawing.Size(80,23);
btn_DItems.Text="详细";
btn_DItems.BackgroundImage = smallbuttonbmp;
tabPage.Controls.Add(btn_DItems);
btn_DItems.Click+=new System.EventHandler(btn_DItems_click);
btn_DItems.FlatStyle = FlatStyle.Popup;
btn_DItems.MouseMove += new MouseEventHandler(this.button_MouseMove);
}
}
tabControl1.Controls.Add(tabPage);
//选中卡页
tabControl1.SelectedIndex = tabControl1.TabPages.IndexOf(tabPage);
bool exist = false;
foreach(TreeNode node in this.treeView1.TopNode.Nodes)
{
if(node.Text.Equals(tabPage.Text.Split('*')[0]))
{
exist = true;
break;
}
}
if( !exist )
{
TreeNode node = new TreeNode(tabPage.Text);
this.treeView1.TopNode.Nodes.Add(node);
}
}
程序生成一个new page,在这个new page上生成八个主按钮,四个lable和相对的textbox,而且对于第四个testbox生成一个打开详细信息的按钮,控件的名称,位置,大小都通过代码来控制,生成控件的个数也完全可以根据对index的赋值来控制,对于按钮的单击方法等相关事件代码要重写。值得一提的是,对于这些生成的控件,虽然被泛化成各种各样的形式,但都是从Control类泛化而来的,本质上还都是Control。
这种动态生成界面的方法在一些时候经常用到,比如说我要通过读取XML文件的信息来进行界面配置,对用户展示不同的界面,使用户可以执行不同的功能。如果习惯了拖拉空间,刚开始做这些事情可能会觉得有些困难和烦琐,但是习惯下来之后,其实也是很方便的事情。