Переключатель формы C# и наоборот

Предположим, у меня есть решение C# с 3 проектами Main, Program1, Program2.
Я хочу иметь "Основную форму", когда я нажимаю кнопку "Программа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   
---------------------------

Я искал Google и не получил ничего полезного!

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. Для "детской формы" я использую 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);
        }
    }
    

Как прокомментировал 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. Это событие не работает, когда кто-то закрывает приложение, когда кто-то убивает приложение из диспетчера задач.

Циркулярные зависимости используются, когда плохая архитектура проекта. В вашем случае я думаю, что проблема в том, что программа1 или программа2 имеют Main в качестве ссылки. Удалите ссылку de Main из программы1 и программы2. Основной проект должен иметь ссылку на программу1 и программу2.

Другие вопросы по тегам