我正在寻找一个很好的模式来解决 Windows 窗体应用程序中的以下循环引用:
- 程序集 1 包含一个带有 Infragistics 菜单项的 Windows 窗体“.Show”ing a Form in Assembly 2
- Assembly 2 包含一个带有 Infragistics 菜单项的 Windows 窗体“.Show”ing a Form in Assembly 1
在整个应用程序中,菜单通常具有相同的项目。因此 Assembly 1 和 Assembly 2 都相互引用以“新建”彼此的表单并显示它们。
关于大小的注意事项:我的应用程序是一个现有的应用程序,所以情况并不像上面的双组装情况那么简单。但是,如果我可以简单地解决上述问题(可能不实现 a ,我可以将其应用于更大的应用程序(大约 20 个组件,所有组件都有多个表单,这些表单在组件之间相互弹出)。
我想过一些解决方案,但它们看起来都很麻烦。我是否缺少一个简单的解决方案?
最佳答案
您可以(在这两种情况下)让按钮简单地触发一个事件。 shell exe 引用这两个程序集,并连接偶数以显示另一个形式。
所以 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();
}
}
关于.net - 循环引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/362918/