隐藏主窗体,启动新窗体,在两者之间切换而不关闭第二窗体

时间:2013-07-02 15:20:34

标签: c# winforms visual-studio-2012

我有两种形式,通过Form1中的buttonClick调用/创建subForm。现在我可以启动subForm,隐藏Form1,然后在关闭subForm时取消隐藏Form1。我希望能做的是:

  1. 如果用户单击changeform按钮,请检查subForm是否处于活动状态但隐藏
  2. 如果不是,则启动subForm,否则隐藏Form1,取消隐藏subForm并将控制传递给它
  3. 如果用户点击了subForm的changeform按钮,请隐藏subForm,取消隐藏Form1并将控制传递给它
  4. 如果用户单击表单右上角的“X”,则关闭应用程序,无论哪个表单处于活动状态。 (现在,选择“X”将关闭subForm并打开/取消隐藏Form1。)
  5. 我可以找到满足要求的部分解决方案(也许全部,我只是太老了,不知道)。要重复我之前的问题,我到目前为止的代码是:

    Form1中

        private void countClick(object sender, EventArgs e)
        {
            this.Hide(); 
            subForm myNewForm = new subForm();
            myNewForm.ShowDialog();
            this.Show();
            countSelect.Checked = false;
        }
    

    和subForm

        private void totalClick(object sender, EventArgs e)
        {
            this.Close();
        }
    

    这很有效,但它不是很优雅。

4 个答案:

答案 0 :(得分:2)

我认为最好的办法就是推出自己的ApplicationContext。这使您可以完全控制应用程序的生命周期,而无需将其绑定到特定的窗口。有关详细信息,请参阅http://msdn.microsoft.com/en-us/library/ms157901.aspx

以下是一个例子:

static class Program
{
    [STAThread]
    static void Main()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        Application.Run(new MyApplicationContext());
    }
}

public class MyApplicationContext : ApplicationContext
{
    public MyApplicationContext()
    {
        ShowForm1();
    }

    public void ShowForm1()
    {
        if (_form2 != null)
            _form2.Hide();
        if (_form1 == null)
        {
            _form1 = new Form1(this);
            _form1.FormClosed += OnFormClosed;
        }
        _form1.Show();
        MainForm = _form1;
    }

    public void ShowForm2()
    {
        if (_form1 != null)
            _form1.Hide();
        if (_form2 == null)
        {
            _form2 = new Form2(this);
            _form2.FormClosed += OnFormClosed;
        }
        _form2.Show();
        MainForm = _form2;
    }

    private void OnFormClosed(object sender, FormClosedEventArgs e)
    {
        if (_form1 != null)
        {
            _form1.Dispose();
            _form1 = null;
        }
        if (_form2 != null)
        {
            _form2.Dispose();
            _form2 = null;
        }
        ExitThread();
    }

    private Form1 _form1;
    private Form2 _form2;
}

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    public Form1(MyApplicationContext context)
        : this()
    {
        _context = context;
    }

    private void button1_Click(object sender, EventArgs e)
    {
        if (_context != null)
            _context.ShowForm2();
    }

    private readonly MyApplicationContext _context;
}

public partial class Form2 : Form
{
    public Form2()
    {
        InitializeComponent();
    }

    public Form2(MyApplicationContext context)
        : this()
    {
        _context = context;
    }

    private void button1_Click(object sender, EventArgs e)
    {
        if (_context != null)
            _context.ShowForm1();
    }

    private readonly MyApplicationContext _context;
}

答案 1 :(得分:2)

因此,我们将首先转到子表单并创建一个新事件,该事件可用于在想要更改表单时通知父项:

public event Action ChangeForm;

然后我们触发事件并在想要更改表单时隐藏子表单:

private void ChangeForm_Click(object sender, EventArgs e)
{
    Hide();
    if (ChangeForm != null)
        ChangeForm();
}

父表单需要子表单的实例作为实例字段:

private subForm child = new subForm();

它需要在它的构造函数中初始化它,既可以向ChangeForm事件添加处理程序以显示父项,也可以向已关闭的事件添加处理程序以自行关闭:

public Form1()
{
    InitializeComponent();

    child.ChangeForm += () => Show();
    child.FormClosed += (s, args) => Close();
}

然后剩下的就是父表单隐藏自己并显示孩子何时想要更改表单:

private void ChangeForm_Click(object sender, EventArgs e)
{
    Hide();
    child.Show();
}

答案 2 :(得分:0)

为什么不简单地将它们设置为前景,最上面等等? 然后将它们设置为反之亦然?

---添加为建议的评论

答案 3 :(得分:-1)

MainForm 访问subForm

subForm和字段中创建构造函数:

MainForm MainFormRef_Field;
subForm(MainForm MainFormRef)
{
    this.MainFormRef_Field = MainFormRef;
}

现在,您可以使用此引用访问MainForm。像这样:

MainFormRef_Field.Show();
MainFormRef_Field.Hide(); //or how ever you want to handle it

subForm 访问MainForm

要处理您的subForm,请使用您为其创建的对象。这里:

subForm myNewForm = new subForm();

如果任何表单关闭,则关闭整个应用程序:

为两种表单设置Form_Closing事件:

private void MainForm_Closing(object sender, EventArgs e)
{
    Application.Exit();
}

private void subForm_Closing(object sender, EventArgs e)
{
    Application.Exit();
}

注意:

我不会为您的所有案例编写完整的代码。设置变量,检查条件。一切都取决于你如何编码。您需要的所有要点我已经为您提供了解决方案。