将前端用户控件带到另一个用户控件的内部,而按钮则置于其中

问题描述 投票:0回答:1

我有一个表单和至少6个用户控件(每个UC都有一个按钮可以转到下一个UC)

  1. 我想先将UC1带到前面
  2. UC1弹出了一个[[button,UC2
  3. 等...
  • 我想知道如何从一个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(); } }

  • c# .net visual-studio winforms user-controls
    1个回答
    0
    投票
    我认为,如果将其留给主表单来确定下一步是什么,而不是在每个UserControl中,则更容易。这使得移动它们或添加一个新的麻烦少了一点。我在这里滥用主要形式作为控制器/演示器。

    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方法。
    © www.soinside.com 2019 - 2024. All rights reserved.