Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 停靠Windows窗体(选项卡式聊天界面)_C#_Tabs_Xmpp_Docking_Agsxmpp - Fatal编程技术网

C# 停靠Windows窗体(选项卡式聊天界面)

C# 停靠Windows窗体(选项卡式聊天界面),c#,tabs,xmpp,docking,agsxmpp,C#,Tabs,Xmpp,Docking,Agsxmpp,为那些说要使用选项卡控件的人编辑 我想使用选项卡控件;但是我不知道如何从主窗体链接选项卡控件。我会假设我必须这样做: 创建带有空白选项卡控件的表单,不创建页面 创建一个CustomuserControl(添加->用户控件),上面有我的控件 当新聊天时,创建一个选项卡控件项,选项卡控件页,将自定义控件添加到选项卡控件页。将选项卡控件句柄添加到哈希表中,以便在新消息传入时,可以在适当的控件中引用它们 但是,我不知道该怎么做。例如,我知道我可以在用户控件内部创建自定义事件,因此,例如,如果每个控件都有

为那些说要使用选项卡控件的人编辑

我想使用选项卡控件;但是我不知道如何从主窗体链接选项卡控件。我会假设我必须这样做:

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

    但是我还需要注册消息回调,这样我就可以使用MessageGrabber向它发送数据,而这不是在UserControl内部分配的,当新窗口进入时,它是通过编程分配的;但由于我没有可引用的控件,因此无法分配


    亲吻哲学

    像我现在做的那样创建表单,然后将表单停靠在窗口或其他地方,不是更容易吗?因此,本质上,它仍然在创建表单,但它也是一个单独的窗口


    原始问题

    好吧,所以我被难住了(当涉及到复杂的C#逻辑lol时,这并不是什么大惊喜)!我想做的是:

    目标:为新聊天应用程序设置选项卡式聊天

    已完成:每当收到聊天信息,或用户从花名册请求新聊天时,打开新窗口。这是完美的工作,只打开一个窗口时,用户还没有打开聊天室。那里很好,很开心

    问题:我不想要windows。嗯,我确实想要一扇窗户,但是,我不想要太多的独立窗户。例如,我们的客户服务团队可能有大约10个活动IM窗口同时运行,我不希望他们有10个窗口平铺在那里lol。我宁愿他们有一个单独的私人IM窗口,所有10个标签停靠在窗口内

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

    • OnMessage:如果还没有新的聊天窗口,则打开新的聊天窗口;如果存在,请在当前聊天窗口中将其作为选项卡打开
    • SendMessage:^^同上^^
    代码示例

    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来自:

    问题
    如何将此代码转换为在选项卡内部打开,而不是在窗口中打开?谁能给我一些建议,帮我解决这个问题。我似乎无法理解这个概念。

    使用

    以下是我根据您的回答所做的假设:创建新窗口,将选项卡控件修饰符公开,在主窗体中,只要窗口已经存在,就创建一个新选项卡。在Util.Add()命令中,使其添加tabControl作为实际添加的ID。然后在收到消息时突出显示该选项卡。这就是你的意思吗?是的。但我认为最好在应用程序启动时创建窗口,只是不要显示它。还设置WindowClosing处理程序,以便当用户点击关闭按钮时,窗口实际上隐藏。因为,当用户关闭聊天窗口,然后新消息到达时,窗口将“还原”之前打开的所有选项卡。我假设,通过创建窗口,并确保在应用程序运行时隐藏窗口,可以绕过“空引用异常”,这是我在尝试向新窗口添加选项卡时看到的。看起来您的设计很糟糕。更常见的方法是创建“用户”对象列表,其中包含“消息”对象列表,并公开“消息到达”事件。当您创建新的聊天窗口(或选项卡)时,它会订阅相应用户的“MessageArrived”事件,并在需要时进行自我更新。您是否也可以提供您所指内容的代码示例?我还不是C#方面的专家,所以我只能做我知道的事情,或者我在inet或培训手册中找到的事情。举个例子会对我有很大帮助。我决定,既然我的主窗体上已经有了一个制表符控件,我就在那里处理制表符的创建;因为我似乎无法让它在新窗口上创建选项卡,所以我只使用我已有的选项卡。我很想在这里看到解决方案,或者看到MDI chidlren的代码示例,但总的来说,至少它使用的是选项卡。选择以下答案作为接受答案,但也希望有其他选项:)