Циркуляр - PullRequest
       6

Циркуляр

3 голосов
/ 12 декабря 2008

Я ищу хороший шаблон для разрешения следующей циклической ссылки в приложении Windows Form:

  • Сборка 1 содержит форму Windows с пунктом меню «Инфраструктура» «Показать» в форме Сборка 2
  • Сборка 2 содержит форму Windows с пунктом меню «Инфраструктура» «Показать» в форме Сборка 1

Меню обычно содержит одни и те же пункты в приложении. Таким образом, и Сборка 1, и Сборка 2 имеют ссылки друг на друга, чтобы «обновлять» формы друг друга и показывать их.

Примечание о размере. Мое приложение - это существующее приложение, поэтому ситуация не так проста, как описанная выше ситуация с двумя сборками. Но если я могу решить вышеперечисленное просто (возможно, не реализуя, я могу применить это к гораздо большему приложению (около 20 компонентов, все с несколькими формами, которые всплывают друг на друга между компонентами).

Я продумал несколько решений, но все они кажутся громоздкими. Есть ли простое решение, которое мне не хватает?

Ответы [ 5 ]

4 голосов
/ 12 декабря 2008

Вы можете (в обоих случаях) заставить кнопку просто вызвать событие. 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();
    }
}
2 голосов
/ 12 декабря 2008

Рассматривали ли вы создание 3-й сборки и перемещение всего общего кода в 3-ю сборку?

1 голос
/ 12 декабря 2008

Используйте фабрику компонентов или составитель компонентов, например MEF , для создания экземпляров без ссылки на исходную сборку компонента.

0 голосов
/ 15 декабря 2008

В настоящее время я решил использовать отражение, чтобы открыть окна, которые должны появиться. Я избавляюсь от необходимости ссылаться на них напрямую, и я на самом деле смогу добавлять компоненты проще, не создавая все перекрестные ссылки.

Я посмотрел на MEF, но, к сожалению, я использую VS2003, а не VS2008. Это предложение привело меня на путь простого размышления.

Спасибо.

0 голосов
/ 12 декабря 2008

А как насчет использования интерфейсов? Вы можете создать третью библиотеку, содержащую интерфейсы, и каждое окно реализует один интерфейс из себя и ссылается на интерфейс другого окна.

...