C# 停靠Windows窗体(选项卡式聊天界面)
为那些说要使用选项卡控件的人编辑 我想使用选项卡控件;但是我不知道如何从主窗体链接选项卡控件。我会假设我必须这样做:C# 停靠Windows窗体(选项卡式聊天界面),c#,tabs,xmpp,docking,agsxmpp,C#,Tabs,Xmpp,Docking,Agsxmpp,为那些说要使用选项卡控件的人编辑 我想使用选项卡控件;但是我不知道如何从主窗体链接选项卡控件。我会假设我必须这样做: 创建带有空白选项卡控件的表单,不创建页面 创建一个CustomuserControl(添加->用户控件),上面有我的控件 当新聊天时,创建一个选项卡控件项,选项卡控件页,将自定义控件添加到选项卡控件页。将选项卡控件句柄添加到哈希表中,以便在新消息传入时,可以在适当的控件中引用它们 但是,我不知道该怎么做。例如,我知道我可以在用户控件内部创建自定义事件,因此,例如,如果每个控件都有
亲吻哲学 像我现在做的那样创建表单,然后将表单停靠在窗口或其他地方,不是更容易吗?因此,本质上,它仍然在创建表单,但它也是一个单独的窗口
原始问题 好吧,所以我被难住了(当涉及到复杂的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的代码示例,但总的来说,至少它使用的是选项卡。选择以下答案作为接受答案,但也希望有其他选项:)