我有一个表单和至少6个用户控件(每个UC都有一个按钮可以转到下一个UC)
表单代码:
public partial class TestProgram : Form
{
public TestProgram()
{
InitializeComponent();
UC21.BringToFront();
}
private void TestProgram_Load(object sender, EventArgs e)
{
UC21.Hide();
UC31.Hide();
UC41.Hide();
UC51.Hide();
UC61.Hide();
UC71.Hide();
UC81.Hide();
}
}
UC1代码:
public partial class UC1 : UserControl { public UC2 UC2{ get; set; } public UC1() { InitializeComponent(); } private void NextPageBut_Click(object sender, EventArgs e) { UC2.BringToFront(); } }
UserControls被添加到表单的Controls集合中。如果我们不使用BringToFront,而是简单地使用Hide and Show,则可以让主窗体找到当前显示的usercontrol(因为其Visible属性设置为true),然后将其隐藏并显示下一个usercontrol。 UserControl具有Parent属性,可以将其转换为主窗体,以便我们可以在其公共接口上调用方法。
UserControl
public partial class UC1 : UserControl
{
public UC1()
{
InitializeComponent();
}
private void NextPageBut_Click(object sender, EventArgs e)
{
// get and cast to the parent form
var tpf = (TestProgram) this.Parent;
// tell the mainform we want to go Next
tpf.Next();
}
}
Mainform Next方法此方法在保持状态决定要采取的操作的同时循环控制。
// our various states enum NextState { Start = 0, ShowOne, Done, } public void Next() { NextState state = NextState.Start; // loop over controls // if you want to foreach(var ctl in Controls) { // find the UserControl ones if (ctl is UserControl) { var uc = (UserControl) ctl; // based on our state ... switch(state) { case NextState.Start: // hide and do the next state if (uc.Visible) { uc.Hide(); state = NextState.ShowOne; } break; case NextState.ShowOne: // show and do the next state uc.Show(); state = NextState.Done; break; default: // do nothing break; } } } if (state != NextState.Done) { // nothing got set // show the first one? // something else? } }
如果确实要使用BringToFront,则必须多加注意,并可能要执行SendToBack来维护Controls集合中的顺序。或者将第二个集合与您的用户控件一起使用,并相应地调整Next方法。