2013-06-25 46 views
0

我有兩種形式。 Form1和Form2Windows窗體中的雙向通信 - 從父母到孩子的回撥

Form 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); 
    } 

有通過我能成功地提高基於Form 2上的用戶操作Form 1代碼的事件。

同樣,我想讓在form2中添加所需的代碼,以便form1可以在form1上完成期望的用戶交互後通知form2。

我正在嘗試探索各種方法。

a)我可以在form2上公開一個公共方法,並允許form1調用它。 b)在form1上定義一個參考form1的公共方法的委託和事件

我有興趣在form2上定義委託和事件,並從from1實現此回調功能。

任何提示???? +++++++++++++++++++++++++++++++++

讓我寫信我如何實現它

我已經在其中既包含Form 1和Form

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

我已經聲明瞭一個參考變量來此委託

public RedrawEventHandler RedrawEvent; 

registred此事件在Form1指着窗口2回撥相同的命名空間中定義一個新的委託功能

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); 

我知道,這是可以做到這一點許多選項之一。但我需要做到這一點,因爲form1是第三方供應商應用程序,我正在開發一個插件

我想確保這兩個之間的緊密耦合,並給予form1開發人員很少的工作來整合我的表單form2)

回答

0

首先,我會認真重新考慮你的設計。 Form1擁有Form2,但他們都會對彼此的事件做出迴應;你有雙向耦合,你把Form2作爲對話框。 Hmm..anyways:

你不同的通信選項有:

1)事件,form1的公開事件窗口2公開事件,他們都訂閱到每個人的事件。

2)事件參數。如果表單1想要將「frm_ResetPathProfileEvent」中的反饋提供給form2,則form2可以將內容添加到可由form1處理的ResetPathProfileEventArgs中,並在引發事件後進行檢查。

3)方法中,由於form1中擁有窗口2它可以調用的公共方法來觸發行爲

4)事件聚合器圖案(轂和輻條模型),訂戶和發行商的去耦(例如IMPL:http://compositewpf.codeplex.com/SourceControl/latest#V4/PrismLibrary/Desktop/Prism/Events/EventAggregator.cs

+0

感謝您的回覆。我現在更新了我的答案,並解釋了爲什麼我必須這樣做:) –

0

代表(和事件)專門用於允許多個訂戶收聽事件。你可以例如有四種形式傾聽該事件,並通知所有人。在你的情況下,你只有一個表單正在監聽,但使用事件的選擇仍然是正確的。

但是,相反,這聽起來不合邏輯,公共方法可能是更好的選擇。你可以這樣看待它。 Form2不關心它將事件發送給誰。只發生了一些事件,任何關心的人都可以聽到(或不聽)。相反,Form1非常關心接收事件的人。它知道Form2需要接收該事件,並且希望將其專門發送給Form2。所以,一個公共的方法將是一條路。

相關問題