假设我有一个C#解决方案,包含3个项目Main,Program1,Program2
我想要一个“主窗体”,当我点击“Program1”按钮时,主窗体将被隐藏,Program1将被显示,当我关闭Program1时,Main窗体将返回。
我怎样才能做到这一点?
我尝试将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();
}
}
}
答案 0 :(得分: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事件。当有人从任务管理器中删除应用程序时关闭应用程序时,此事件不起作用。
答案 1 :(得分:0)
当项目建设不好时,就会发生循环依赖。 在你的情况下,我认为问题migth是program1或program2有Main作为参考。 从程序1和程序2中删除de Main引用。 主项目必须参考program1和program2。
答案 2 :(得分:0)
谢谢大家的回答!
在与客户确认后,他们并不严格需要隐藏“主要形式”,因此我提出了另一个更简单的解决方案:
1.对于“子表单”,我使用ShowDiaglog()
代替Show()
private void btnChildForm1_Click(object sender, EventArgs e)
{
var frm = new ChildForm1();
frm.ShowDialog();
}
对于mainform,我使用mutex
强制它只有一个实例:
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);
}
}