0

私は2つのフォームを持っています。Form1 と Form2

フォーム 2 には、次のコードが含まれています。

    /// Delegate used for Reset
    public delegate void ResetEventHandler(object sender, ResetPathProfileEventArgs e);

    public event ResetEventHandler ResetPathProfileEvent;

    protected virtual void RaiseResetEvent(string status)
    {
        // Raise event if something is listening
        if (ResetPathProfileEvent != null)
        {
            var args = new ResetPathProfileEventArgs { Status = status };
            ResetPathProfileEvent(this, args);
        }
    }

form1で、次のコードを書きました

        var frm = new Form2();
        frm.ResetPathProfileEvent += frm_ResetPathProfileEvent;
        frm.ShowDialog();

    void frm_ResetPathProfileEvent(object sender, ResetPathProfileEventArgs e)
    {
        MessageBox.Show(e.Status);
    }

これで、form2 でのユーザー アクションに基づいて、form1 コードでイベントを正常に発生させることができました。

同様に、フォーム1で予想されるユーザー操作の完了時にフォーム1がフォーム2に通知できるように、フォーム2に必要なコードを追加したいと思います。

そのためのさまざまな方法を模索しています。

a) form2 で public メソッドを公開し、form1 がそれ​​を呼び出せるようにすることができます。b) form2 の public メソッドを参照する form1 でデリゲートとイベントを定義する

form2 でデリゲートとイベントを定義し、from1 からこのコールバック機能を実現することに関心があります。

ヒントはありますか???? +++++++++++++++++++++++++++++++++++

私がそれを達成した方法を書いてみましょう

form1 と form2 の両方を含む同じ名前空間に新しいデリゲートを定義しました

/// Delegate used for Redraw
    public delegate void RedrawEventHandler(RedrawPathProfileEventArgs e);

このデリゲートへの参照変数を宣言しました

 public RedrawEventHandler RedrawEvent;

form2コールバック関数を指すform1でこのイベントに登録されました

 var frm = new Form2();
 frm.ResetPathProfileEvent += frm_ResetPathProfileEvent;
 this.RedrawEvent += new RedrawEventHandler(frm.RedrawCallBackFn);
 frm.Show();

必要に応じて form1 から form2 へのイベントを呼び出す

var args = new RedrawPathProfileEventArgs();
args.FileName = "xyz";
RedrawEvent(args);

これは、これを行うために利用できる多くのオプションの 1 つであることを知っています。しかし、form1 はサード パーティ ベンダーのアプリケーションであり、プラグインを開発しているため、これを行う必要があります。

これら 2 つの間の緊密な結合を確保し、フォーム (form2) を統合するための form1 開発者の作業を最小限に抑えたいと考えていました。

4

2 に答える 2

0

まず、あなたのデザインを真剣に再考します。Form1 は Form2 を所有していますが、どちらもお互いのイベントに応答します。双方向の結合があり、Form2 をダイアログとして配置しています。うーん..とにかく:

さまざまな通信オプションは次のとおりです。

1) イベント、フォーム 1 はイベントを公開し、フォーム 2 はイベントを公開し、両方がお互いのイベントにサブスクライブします。

2) イベント引数。フォーム 1 が "frm_ResetPathProfileEvent" でフォーム 2 にフィードバックを提供したい場合、フォーム 2 は、フォーム 1 によって操作され、イベントが発生した後にチェックできるものを ResetPathProfileEventArgs に追加できます。

3) メソッド。form1 は form2 を所有しているため、パブリック メソッドを呼び出して動作をトリガーできます。

4) イベント アグリゲーター パターン (ハブ アンド スポーク モデル)、サブスクライバーとパブリッシャーの分離 (実装例: http://compositewpf.codeplex.com/SourceControl/latest#V4/PrismLibrary/Desktop/Prism/Events/EventAggregator.cs )

于 2013-06-25T05:57:04.467 に答える