Dock Windows Forms(选项卡式聊天界面)

时间:2011-04-23 14:44:44

标签: c# tabs xmpp docking agsxmpp

编辑那些说要使用标签控件的人

我很想使用标签控件;但我不知道如何从主窗体链接选项卡控件。我认为我必须做这样的事情:

  1. 创建表格,上面有空白的TabControl,没有创建页面。
  2. 创建一个CustomuserControl(添加 - >用户控件),上面有我的控件。
  3. 当新聊天进入时,创建一个选项卡控件项目,选项卡控件页面,将自定义控件添加到选项卡控件页面。将选项卡控件句柄添加到哈希表中,以便在新邮件进入时,可以在适当的控件中引用它们。
  4. 但是,我不知道该怎么做。例如,我知道我可以在用户控件内部创建自定义事件,因此,例如,如果每个控件都有一个“粗体”按钮,我可以在每个页面上有该控件,实际使用该按钮。

    然而,我还需要注册消息回调,以便我可以使用MessageGrabber向其发送数据,而不是在UserControl内部分配,这是在新窗口进入时以编程方式分配的;但由于我没有控制参考,我无法分配。


    KISS哲学

    创建表单会不会像现在这样容易,然后只是将窗体停靠在窗口或其他东西中?所以,从本质上讲,它仍然在创建表单,但它也是一个单独的窗口?


    原始问题

    好吧,所以我很难过(当谈到复杂的C#逻辑lol时,这并不是什么大惊喜)!我想要做的是以下几点:

    目标:设置标签聊天新聊天应用程序。

    已完成:每当收到聊天消息或用户请求名册中的新聊天时,请打开新窗口。这工作正常,并且当用户尚未打开聊天时仅打开一个窗口。那里很开心,很开心。

    问题:我不想要Windows。好吧,我确实想要一个窗口,但是,我不想要大量的单独窗户。例如,我们的客户服务团队可能一次有大约10个活动的IM窗口,我不希望他们必须有10个窗口平铺在那里大声笑。我宁愿他们有一个私人IM窗口,所有10个标签停靠在窗口内。

    逻辑:这是我的逻辑,可能有缺陷,我道歉:

    • OnMessage:打开新的聊天窗口(如果尚未存在);如果存在,请在当前聊天窗口中将其作为选项卡打开。
    • SendMessage:^^ ditto ^^

    代码示例

    if (!Util.ChatForms.ContainsKey(msg.From.Bare))
                {
                    RosterNode rn = rosterControl1.GetRosterItem(msg.From);
                    string nick = msg.From.Bare;
                    if (rn != null)
                        nick = rn.Text;
                    frmChat f = new frmChat(msg.From, xmpp, nick);
                    f.Show();
                    f.IncomingMessage(msg);
                    return;
                }
    

    上面的注释:Util。函数只是跟踪哈希表中打开的窗口的轨迹,这样,当消息进入时,它们会路由到正确的窗口。这是添加:

    Util.ChatForms.Add(m_Jid.Bare.ToLower(), this);
    

    以frmChat()形式命令。

    正在使用的图书馆:agsxmpp来自:http://www.ag-software.de/agsxmpp-sdk/download/

    问题: 如何将此代码转换为在标签内部而不是窗口中打开?有人可以给我一些想法,并提供帮助。我似乎无法绕过这个概念。

1 个答案:

答案 0 :(得分:0)

使用TabControl