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

Posted

技术标签:

【中文标题】Dock Windows Forms(选项卡式聊天界面)【英文标题】:Dock Windows Forms (tabbed chat interface) 【发布时间】:2011-04-23 14:44:43 【问题描述】:

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

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

    创建带有空白 TabControl 的表单,没有创建页面。 创建一个 CustomuserControl(添加 -> 用户控件),上面有我的控件。 当有新的聊天进来时,创建一个选项卡控件项,选项卡控件页面,将自定义控件添加到选项卡控件页面。将选项卡控件句柄添加到哈希表中,这样当有新消息进来时,可以在适当的控件中引用它们。

但是,我不知道该怎么做。例如,我知道我可以在用户控件内部创建自定义事件,例如,如果每个控件都有一个“粗体”按钮,我可以让每个拥有该控件的页面实际使用该按钮。

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


KISS 理念

像我现在这样创建表单,然后将该表单停靠在窗口或其他东西中,这不是更容易吗?这样,本质上它仍然是在创建表单,但它也是一个单独的窗口?


原始问题

好吧,我被难住了(当涉及到复杂的 C# 逻辑时,这并不奇怪,哈哈)!我想要做的是以下几点:

目标:为新的聊天应用设置标签式聊天。

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

问题:我不想要窗户。好吧,我确实想要一个窗口,但是,我不想要大量单独的窗口。例如,我们的客户服务团队可能同时有大约 10 个活动的 IM 窗口,我不希望他们必须有 10 个窗口平铺在那里哈哈。我宁愿他们有一个私人 IM 窗口,并且所有 10 个选项卡都停靠在窗口内。

逻辑:这是我的逻辑,可能有缺陷,我深表歉意:

OnMessage:如果新的聊天窗口不存在,则打开;如果存在,请将其作为当前聊天窗口中的选项卡打开。 发送消息:^^ 同上 ^^

代码示例

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/

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

【问题讨论】:

看来你这里的设计不好。做这些事情的更常见方法是拥有“用户”对象列表,其中包含“消息”对象列表并公开“消息到达”事件。当您创建新的聊天窗口(或选项卡)时,它会订阅相应用户的“MessageArrived”事件并在需要时自行更新。 您是否也可以提供一个代码示例来说明您所指的内容?我还不是 C# 方面的专家,所以我只能做我所知道的,或者我在 inet 或培训手册中找到的。一个例子对我有很大帮助。 我决定,因为我的主窗体上已经有一个选项卡控件,所以我只需在那里处理选项卡创建;因为我似乎无法让它在新窗口上创建标签,所以我将使用我已经拥有的。很想在这里看到解决方案,或者看到 MDI chidlren 的代码示例,但总的来说,至少它与选项卡一起使用。选择以下答案作为接受,但也会喜欢其他选项:) 【参考方案1】:

使用TabControl

【讨论】:

这些是我从您的回答中得出的假设:创建新窗口,将选项卡控件修饰符公开,在主窗体中,只要窗口已经存在,就创建一个新选项卡。在 Util.Add() 命令中,将 tabControl 添加为实际添加的 ID。然后在收到消息时突出显示该选项卡。这是您的意思吗? 是的。但我认为最好在应用程序启动时创建窗口,只是不要显示它。还要设置 WindowClosing 处理程序,以便当用户点击关闭按钮时,窗口实际上会隐藏。因此,当用户关闭聊天窗口然后有新消息到达时,窗口将“恢复”之前打开的所有选项卡。 我假设已经创建了窗口,并确保它在应用程序运行时隐藏,这将绕过“空引用异常”,我在尝试将选项卡添加到新窗口时看到窗口。

以上是关于Dock Windows Forms(选项卡式聊天界面)的主要内容,如果未能解决你的问题,请参考以下文章

Prism Xamarin Forms 选项卡式页面导航不起作用

如何在 Xamarin.Forms 的 TabbedPage 的选项卡中放置一个按钮?

Xamarin - 从按钮更改选项卡式页面

xamarin.form Tabbed选项卡式页

选项卡式控件上的 MS Access 2007 引用子窗体控件返回 null

高级 Windows 应用程序 UI(MDI 选项卡式组)