【问题标题】:C# form switch and vice versaC# 表单切换,反之亦然
【发布时间】:2017-12-28 17:39:27
【问题描述】:

假设我有一个包含 3 个项目 Main、Program1、Program2 的 C# 解决方案。
我想要一个“主窗体”,当我点击“程序1”按钮时,主窗体将被隐藏,程序1将被显示,当我关闭程序1时,主窗体将返回。
我怎样才能做到这一点? 我尝试添加 Program1 和 PROgram2 作为对 Project Main 的引用,并在 Main 中添加如下代码,它适用于调用 Program1,但无法处理事件 Program1.closed(),因为当我尝试将 Main 引用到 Program1 时,它会出错

---------------------------
Microsoft Visual Studio
---------------------------
A reference to 'Main' could not be added. Adding this project as a reference would cause a circular dependency.
---------------------------
OK   
---------------------------

我搜索了谷歌并没有任何帮助!

using System;
using System.Windows.Forms;

namespace Switch
{
    public partial class Main : Form
    {
        public Main()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            Program1.Form1 pf1 = new Program1.Form1();
            pf1.Show();
            this.Hide(); 
        }
    }
}

【问题讨论】:

  • 您真的想要 3 个不同的应用程序吗?还是只有 1 个应用程序和 3 个表单?
  • 感谢@CamiloTerevinto 的快速评论,我需要 3 个应用程序,因为它来自 3 个不同的供应商。
  • 我猜你可以使用new Process 启动每个表单并实现单个实例来调出另一个表单。
  • @zcui93 : 主窗体刚刚被隐藏,没有关闭,所以我需要将其显示回来,而不是另一个主窗体实例。
  • 是的。搜索不同的单实例方法。这就是你所需要的。

标签: c# winforms fundamentals-ts


【解决方案1】:

正如 zcui93 评论的那样,您可以使用过程来使其工作。您可以将所有 3 个都放在同一个文件夹中(当您在客户端计算机上部署应用程序时)

using System.Diagnostics;
...
Process process = new Process();
// Configure the process using the StartInfo properties.
process.StartInfo.FileName = "process.exe";
process.StartInfo.Arguments = "-n";
process.StartInfo.WindowStyle = ProcessWindowStyle.Maximized;
process.Start();
process.WaitForExit();// Waits here for the process to exit.

在 C# 中,您可以使用 Process.Exited 事件。当有人从任务管理器中杀死应用时,当有人关闭应用时,此事件不起作用。

【讨论】:

    【解决方案2】:

    当项目架构不好时会发生循环依赖。 在您的情况下,我认为问题可能是 program1 或 program2 有 Main 作为参考。 从 program1 和 program2 中删除 de Main 引用。 主项目必须有program1和program2的引用。

    【讨论】:

    • 感谢您的反馈,我理解错误,您错过了我的意思。在 Program1 关闭后,我需要一些方法来再次显示主窗体。
    【解决方案3】:

    感谢大家的回答!
    与客户确认后,他们并不严格需要隐藏“主窗体”,所以我提出了另一个更简单的解决方案:
    1.对于“子表单”,我使用ShowDiaglog()而不是Show()

        private void btnChildForm1_Click(object sender, EventArgs e)
        {
            var frm = new ChildForm1();
            frm.ShowDialog();
        }
    
    1. 对于主窗体,我使用mutex 强制它只有1 个实例:

      static class Program
      {
          /// <summary>
          /// The main entry point for the application.
          /// </summary>
          /// 
      
      
          [STAThread]
          static void Main()
          {
              var mutex = new Mutex(true, "MainForm", out var result);
              if (!result)
              {
                  MessageBox.Show("Running!");
                  return;
              }
              Application.EnableVisualStyles();
              Application.SetCompatibleTextRenderingDefault(false);
              Application.Run(new MainForm());
              GC.KeepAlive(mutex);
          }
      }
      

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-02-26
      • 1970-01-01
      • 2012-06-27
      • 2017-02-18
      • 2018-02-10
      • 2017-09-14
      • 2015-09-10
      • 2014-03-21
      相关资源
      最近更新 更多