c# - 隐藏主窗体,启动新窗体,在不关闭第二窗体的情况下在两者之间切换

标签 c# winforms visual-studio-2012

我有两个表单,子表单由 Form1 中的 buttonClick 调用/创建。现在我可以启动子窗体,隐藏 Form1,然后在子窗体关闭时取消隐藏 Form1。我希望能够做的是:

  1. 如果用户点击 changeform 按钮,检查子表单是否处于事件状态但隐藏
  2. 如果不是,则启动子窗体,否则隐藏窗体1,取消隐藏子窗体并将控制权交给它
  3. 如果用户点击 subForm 的 changeform 按钮,隐藏 subForm,取消隐藏 Form1 并将控制传递给它
  4. 如果用户单击表单右上角的“X”,则关闭应用程序,无论哪个表单处于事件状态。 (现在,选择“X”会关闭子窗体并打开/取消隐藏 Form1。)

我可以找到满足部分要求的解决方案(也许是全部,我太菜鸟了,不知道)。在这里重复我之前的问题,我目前拥有的代码是:

表格 1

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

和子表单

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

这可行,但不是很优雅。

最佳答案

我认为最好的方法是滚动你自己的 ApplicationContext。这允许您完全控制应用程序的生命周期,而无需将其绑定(bind)到特定的窗口。参见 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;
}

关于c# - 隐藏主窗体,启动新窗体,在不关闭第二窗体的情况下在两者之间切换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17429464/

相关文章:

visual-studio-2012 - Visual Studio 2012 终止了我的 WCF 服务引用

javascript - Visual Studio 2012 JavaScript Intellisense 不工作

c# - 如何快速有效地从 'simple' 截图中读取文本?

c# - 为什么双重比较不适用于 if 条件?

c# - Selenium Click 不工作 - Chrome 驱动程序 - 版本 73.0.3683.68

c# - WinForm ZIndex 到桌面

c# - 绑定(bind)到派生集合的 ListView 未更新(XAML/Windows 8)

c# - 检查碰撞的更简单方法?

c# - 当用户与 UI 交互时运行新进程

c# - 如何为多个 Visual Studio 版本打包基于 VSIX 的扩展?