我是 C# 的新手,花了一整天的时间寻找解决这个问题,以解决我遇到的问题,如果这很简单,或者已经很抱歉了!我有两个表单,主窗体和配置窗体。主要加载,并有一个按钮打开配置表单,然后隐藏自己,如下所示:
private void btnConfig_Click(object sender, EventArgs e)
{
Config config = new Config();
config.Show();
this.Visible = false;
}
它工作正常,配置窗体打开。配置来自有两个按钮(保存和关闭按钮)。本质上,这两个按钮具有相同的最终效果,关闭配置窗体并重新显示主窗体,编码如下:
private void btnClose_Click(object sender, EventArgs e)
{
this.Hide();
Main main = new Main();
main.Visible = true;
}
问题是,如果我使用"十字"关闭配置屏幕,配置将"关闭",但不显示 Main 并且程序继续运行。我尝试使用OnFormCloseing并陷入了一个可怕的循环!叉号应执行与保存/关闭按钮相同的操作,隐藏配置窗体并再次打开 Main。
如果您想显示配置表单并在配置更改时重新显示主窗体,您通常需要一些东西作为配置表单来显示模态。
要显示模态表单,您将使用 ShowDialog()
。 ShowDialog()
也是一个阻止呼叫,它使您能够从离开的地方继续。
在主窗体中:
private void btnConfig_Click(object sender, EventArgs e)
{
var config = new Config();
this.Visible = false;
// this call blocks!
var dialogResult = config.ShowDialog();
// when the configform is closed, the code resumes here
this.Visible = true;
}
这也为您提供了通过设置 DialogResult
配置窗体的属性,以便在关闭之前DialogResult.Cancel
。
我不太确定你到底在寻找什么,但这就是我会怎么做。
将函数更改为以下内容,并在主窗体类下有一个私有Config
对象。
private Config config;
private void btnConfig_Click(object sender, EventArgs e)
{
if(config==null || config.IsDisposed)
{
config = new Config(this); // Pass the main form into the constructor of config
}
config.ShowDialog();
this.Visible = false;
}
创建一个构造函数(用于 Config),它将主窗体作为参数,并将主窗体作为私有对象。这允许您显示原始表单,以便每次都创建一个新表单。
private Form mainForm;
public Config(Form main)
{
mainForm = main;
}
并改变您的关闭操作。
private void btnClose_Click(object sender, EventArgs e)
{
this.Hide();
mainForm.Visible = true;
}