0

我正在使用 agsXMPP 库开发基于 XMPP 的 Microsoft 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 方式,而且这些匿名方法很难维护。那么,在这种情况下,我怎样才能以更好的方式编码呢?对不起我的英语不好,我已经尽力说清楚了^_^谢谢!</p>

4

2 回答 2

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);
    }
于 2012-05-31T14:52:34.000 回答
0
  1. 我不会在您的代码隐藏类中处理 XMPP 事件。创建一个只负责处理事件的类。
  2. 创建一个接口,该类将使用漂亮的干净方法来转换 XMPP 事件,例如NewRosterItem(RosterItem item)
  3. 通过调用调度程序调用这些方法(即将 BeginInvoke 封装到处理事件的类中。
  4. 让您的视图实现接口并注册事件处理类,然后他们可以创建和更新任何必要的控件。
于 2012-05-31T15:15:49.930 回答