.net - 循环引用

标签 .net winforms circular-dependency

我正在寻找一个很好的模式来解决 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/

相关文章:

c# - 循环依赖 C# 项目与 Python 包

.net - 正则表达式匹配所有

C# MetroTile 背景色/前色在鼠标进入/离开期间不改变

C# DataGridView - 特定列的自定义格式

design-patterns - 避免循环依赖的模式

asp.net-mvc-3 - Autofac 属性注入(inject)

.net - 如果我必须为 Oracle .net Entity Framework 在 app.config 中定义每个字段,ORM 的意义是什么

c# - 通用属性缺点?

.net - Nuget:将多个大型解决方案迁移到 PackageReference

c# - Visual Studio在某些设计师身上崩溃