2012-05-31 29 views
0

我正在開發基於XMPP的使用agsXMPP庫的微軟WPF即時消息應用程序。在agsXMPP中有很多事件,比如OnXmppConnectionStateChanged,OnLogin,OnPresence等,另一方面,由於WPF線程模式,我必須通過UI的Dispatcher.Invoke()方法處理事件,它看起來像這樣:如何以更多的方式設計這些代碼?

void handleRosterItem(object sender, agsXMPP.protocol.iq.roster.RosterItem item) 
    { 
     STP_FriendsHolder.Dispatcher.BeginInvoke(new Action(delegate 
     { 
      RosterItemControl rosterItem = new RosterItemControl(); 
      rosterItem.RosterItemName = item.Jid.User; 
      rosterItem.Margin = new Thickness(0); 
      STP_FriendsHolder.Children.Add(rosterItem); 
     })); 
    } 

我用匿名方式在幾乎所有的BeginInvoke/Invoke方法,因爲我不想到處創造太多的命名方法(我認爲這是不那麼「乾淨」)。但是我擔心這不是OOP的方式,而且這些匿名方法很難維護。那麼,如何在這種情況下以更好的方式編碼? 我爲我的英語不好對不起,我已經盡我所能說清楚^ _^ 感謝!

回答

0
  1. 我不會處理在你的代碼隱藏類的XMPP事件。創建一個負責處理事件的類。
  2. 創建一個接口,該類將使用乾淨的方法來轉換XMPP事件,例如, NewRosterItem(RosterItem item)
  3. 調用這些方法通過調用調度程序(即封裝的BeginInvoke只是爲了處理事件的類。
  4. 有你的視圖實現接口,並與事件處理類註冊,他們就可以創建和更新任何控制是必要的
+0

令人驚訝的是,你已經回答了我真正想問的問題。現在我的代碼處於混亂狀態,並且沒有設計,匿名事件處理我隨處可見。你給我一個很好的建議,謝謝Slugart。 – yman

+0

@yman很高興聽到我的幫助,隨時將其標記爲答案;) – Slugart

1

,因爲我不想到處創造太多的命名方法

所以你不想重用任何BeginInvoke/Invoke代碼?這很好。

雖然我會反對「乾淨」的評論。

哪個更清潔?哪一個對你更可讀?這...

STP_FriendsHolder.Dispatcher.BeginInvoke(new Action(delegate 
    { 
     RosterItemControl rosterItem = new RosterItemControl(); 
     rosterItem.RosterItemName = item.Jid.User; 
     rosterItem.Margin = new Thickness(0); 
     STP_FriendsHolder.Children.Add(rosterItem); 
    })); 

...或者這個?

STP_FriendsHolder.Dispatcher.BeginInvoke(AddRosterItem); 


    void AddRosterItem() 
    { 
     RosterItemControl rosterItem = new RosterItemControl(); 
     rosterItem.RosterItemName = item.Jid.User; 
     rosterItem.Margin = new Thickness(0); 
     STP_FriendsHolder.Children.Add(rosterItem); 
    } 
+0

謝謝奧斯汀,我認爲你是對的,命名方法可以重用,他們更合理。事實上,這只是一個實踐項目,以提高我的代碼技能,我當然會重新編碼它時第一個版本完成了,再次感謝你! – yman

相關問題