一慰丛、
開發(fā)Winform的程序員們一定遇到過這樣的窗口
這種窗口最大的問題是功能太多擎析,可能會有很多控件和事件的處理代碼览妖,會非常難維護轧拄。
二、
遇到這種窗口讽膏,我一般會將每一個tab頁做成獨立的Form然后通過以下代碼組合起來
var frm = new Form2();
frm.TopLevel = false;
frm.Parent = this;
frm.Show();
效果是這樣的
三檩电、
為了讓用戶無感知,在做一些以下調(diào)整
var frm = new Form2();
frm.TopLevel = false;
frm.Parent = panel1; //設(shè)置一個區(qū)域
frm.FormBorderStyle = FormBorderStyle.None; //無邊框
frm.Dock = DockStyle.Fill; //最大化
frm.Show();
四府树、
這種做法的好處是顯而易見的:
每個窗口中的功能相對處于獨立的Form中俐末,代碼不會混亂;
如果需要對整個功能進行替換奄侠,重構(gòu)或刪除卓箫,只要修改Form或刪除整個Form即可;
在一些特殊場景下還可以獨立彈出使用垄潮,等等……
而對于用戶來說烹卒,完全不知道這個窗口是由多個窗口組合而成的闷盔,可以說無副作用。
五旅急、
封裝成一個擴展方法方便調(diào)用逢勾,順便處理一些簡單的異常
using System;
using System.Windows.Forms;
static class Extensions
{
public static void Into(this Form form, Control control)
{
if (form == null || form.InvokeRequired)
{
form?.Invoke((Action)(() => Into(form, control))); //防止跨線程異常
return;
}
form.TopLevel = false;
form.Parent = control;
form.FormBorderStyle = FormBorderStyle.None;
form.Dock = DockStyle.Fill;
form.Show();
}
}
六、
應(yīng)用到tab頁
添加代碼
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
new Form2().Into(tabPage1);
new Form3().Into(tabPage2);
new Form4().Into(tabPage3);
}
}
效果是這樣的:
七藐吮、
為了更方便的使用(不想在刪除或添加新的窗口的時候改動代碼)溺拱,再作以下調(diào)整:
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
foreach (TabPage page in tabControl1.TabPages)
{
if (page.Tag is string s)
{
var type = Type.GetType(s, false, true);
if (type != null)
{
var form = (Form)Activator.CreateInstance(type);
form.Into(page);
form.BackColor = Color.White;
}
else
{
page.Controls.Add(new Label
{
Text = s + " 構(gòu)造失敗",
AutoSize = false,
Dock = DockStyle.Fill,
TextAlign = ContentAlignment.MiddleCenter,
});
}
}
}
}
}
這樣我只需要將page的tag設(shè)置成窗口的類名全名就可以了
八、
如果可以幫到你谣辞,別忘了幫我點一下喜歡迫摔,讓更多的人看到