我正在寻找一个好的模式来解决Windows窗体应用程序中的以下循环引用:
在整个应用程序中,菜单上通常包含相同的项目。因此,大会1和大会2都互相提及“新建”一个人的形式和。显示它们。
关于尺寸的说明:我的应用程序是一个现有的应用程序,因此情况并不像上面的两个装配情况那么简单。但是,如果我可以简单地解决上述问题(可能没有实现一个,我可以将它应用于更大的应用程序(大约20个组件,所有组件都有多个组件在组件之间相互弹出)。
我已经考虑了一些解决方案,但它们看起来都很麻烦。有一个我想念的简单解决方案吗?
答案 0 :(得分:4)
你可以(在两种情况下)使按钮只是举起一个事件。 shell exe引用了两个程序集,并连接了even以显示另一个表单。
所以exe知道两者;这两种形式都不了解对方。
例如(相同的概念):
using System;
using System.Windows.Forms;
class Form1 : Form
{
public event EventHandler Foo;
public Form1()
{
Button btn = new Button();
btn.Click += delegate { if(Foo!=null) Foo(this, EventArgs.Empty);};
Controls.Add(btn);
}
}
class Form2 : Form
{
public event EventHandler Bar;
public Form2()
{
Button btn = new Button();
btn.Click += delegate { if (Bar!= null) Bar(this, EventArgs.Empty); };
Controls.Add(btn);
}
}
static class Program
{
[STAThread]
static void Main()
{
ShowForm1();
Application.Run();
}
static void ShowForm1()
{
Form1 f1 = new Form1();
f1.Foo += delegate { ShowForm2(); };
f1.Show();
}
static void ShowForm2()
{
Form2 f2 = new Form2();
f2.Bar += delegate { ShowForm1(); };
f2.Show();
}
}
答案 1 :(得分:2)
您是否考虑过创建第3个程序集并将所有常用代码移动到第3个程序集中?
答案 2 :(得分:1)
使用组件工厂或组件编写器(如MEF)创建实例,而不引用组件的源程序集。
答案 3 :(得分:0)
使用接口怎么样? 您可以构建包含接口的第三个库,每个窗口都实现一个接口,并引用另一个窗口的接口。
答案 4 :(得分:0)
此刻,我决定使用反射来弹出需要弹出的窗口。我不需要直接引用它们,我实际上可以更容易地添加组件,而无需创建所有交叉引用的程序集。
我看了MEF但不幸的是,我使用的是VS2003,而不是VS2008。这个建议让我走上了简单反思的道路。
感谢。