使用控制器和事件来解耦表单
这种情况下正确的做法是通过引入一个“控制器”类并使用“事件”来信号状态变化,将两个表单相互解耦。
以下是一个示例。
首先,创建一个名为“WindowsFormsApplication1”的新默认Windows Forms应用程序,并添加两个表单,“form1”和“form2”。
然后在“form1”中添加一个名为“button1”的按钮和一个名为“label1”的标签。
然后在“form2”中添加一个名为“checkbox1”的复选框。
在“form1”设计器中,双击按钮以添加单击处理程序。
在“form2”设计器中,双击复选框以添加更改处理程序。
现在添加一个名为“Controller”的新类,并向其中添加以下代码:
using System;
using System.Windows.Forms;
namespace WindowsFormsApplication1
{
internal sealed class Controller
{
public void RunForm1()
{
_form1 = new Form1();
_form1.ButtonClicked += (sender, args) => showForm2();
Application.Run(_form1);
}
private void showForm2()
{
var form2 = new Form2();
form2.CheckBoxChanged +=
(sender, args) =>
_form1.SetLabel("Checkbox = " + ((CheckBox)sender).Checked);
form2.ShowDialog(_form1);
}
private Form1 _form1 ;
}
}
现在将
Form1.cs
更改为以下内容:
using System;
using System.Windows.Forms;
namespace WindowsFormsApplication1
{
public partial class Form1: Form
{
public event EventHandler ButtonClicked;
public Form1()
{
InitializeComponent();
}
public void SetLabel(string text)
{
label1.Text = text;
}
private void button1_Click(object sender, EventArgs e)
{
var handler = ButtonClicked;
if (handler != null)
handler(sender, e);
}
}
}
把 Form2.cs
改成这样:
using System;
using System.Windows.Forms;
namespace WindowsFormsApplication1
{
public partial class Form2: Form
{
public event EventHandler CheckBoxChanged;
public Form2()
{
InitializeComponent();
}
private void checkBox1_CheckedChanged(object sender, EventArgs e)
{
var handler = CheckBoxChanged;
if (handler != null)
handler(sender, e);
}
}
}
最后,请将
Program.cs
更改为以下内容:
using System;
using System.Windows.Forms;
namespace WindowsFormsApplication1
{
static class Program
{
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Controller controller = new Controller();
controller.RunForm1();
}
}
}
现在运行程序并单击按钮,然后点击复选框几次。您将看到Form1中的标签正在更改。
通过这种方式,您已经完全将Form1与Form2解耦,并将控制逻辑放置到一个单独的Controller类中。