2

C#アプリで複数のウィンドウ間をやり取りする最良/適切な方法は何ですか? 最近、プログラム ウィンドウの 1 つがメイン ウィンドウを変更するメソッドを呼び出さなければならないという問題に遭遇しました。私の解決策は、基礎となるすべてのモデルデータを整理し、さまざまなウィンドウ間の通信を (デリゲートを介して) 整理する、ファクトリのようなクラスを作成することでした。しかし、1 つまたは 2 つのデリゲートを渡すことは問題ではなかったので、他のウィンドウがメイン ウィンドウと適切に対話するために 10 のデリゲートを必要とする場合はどうすればよいか考え始めました。デリゲートは良い解決策ですか? それらを適切な方法で渡す方法-コンストラクター、プロパティを介して? それとも、それほど多くのデリゲートを使用する必要があること自体が、重大な設計上の欠陥なのでしょうか?

4

5 に答える 5

3

モデルをコントローラーでビューから分割する必要があります。フォーム参照と共有情報を管理できるオブジェクトを配置します。

別の解決策は、formX の参照を formY に送信して、この方法で通信できるようにすることです。

于 2008-11-12T13:42:42.773 に答える
1

サブジェクト/オブザーバー パターンを使用するカスタム フォーム マネージャーを使用します。

開かれたすべてのフォームは FormsManager に報告され、FromsManager はそれ自体をフォームのオブザーバーにします。

また、フォームを FormsManager のオブザーバーにします。

したがって、すべてのフォームが FormsManager を監視し、FormsManager がすべてのフォームを監視することになります。その後、各フォームは FormsManager を介して他のフォームと通信でき、各フォームは他のすべてのフォームを認識する必要はありません。

于 2008-11-12T14:00:04.720 に答える
0

メイン ウィンドウとの対話のみが必要な場合は、他のコンストラクターでメイン ウィンドウへの参照を指定しないでください。

public class MainForm : Form
{
}

public class OtherForm : Form
{
    protected MainForm MainForm { get; set; }

    public OtherForm(MainForm mainForm) : base()
    {
        this.MainForm = mainForm;
    }
}

編集:

シンプルで効果的。

フォームがアプリケーションの他のすべてのフォームと対話する必要がある場合は、サービス ロケータータイプ パターンが適している可能性があります。

于 2008-11-12T13:34:27.283 に答える
0

以前の MFC では、すべてのウィンドウに通知するものがありました。パラメータを使用してイベント ID を渡します。

イベント ID とパラメーターのコレクションを公開する 1 つのデリゲートで同様のことを行うことができます。

これの最大の利点は、ウィンドウが 1 つのゲートウェイを実装するだけで済むことです。

于 2008-11-12T13:34:52.837 に答える
0

カスタム EventArgs を使用して、通知のタイプ、追加のパラメーターなどのいくつかの情報を渡す単一のデリゲートを使用できます。

于 2008-11-12T13:39:26.323 に答える