WPF一步步开发XMPP IM客户端2:主窗体设计
UI设计方案:

在设计窗体UI之前,先要了解一些主要的接口和帮助类:
对于主窗的左侧列表,容器内的Item必须实现ILeftItem的接口,比如联系人、系统消息、群等,接口包含点击事件
public interface ILeftItem
{
void Click();
}
项目的最外围容器是MainWindow,他涵盖了第一级菜单、第二级菜单、内容区等
其中更新菜单是在类UIStatic中:
/// <summary>
/// 设置第一级"业务"菜单文本
/// </summary>
internal static void SetBussTabText(string str)
{
mainWindow.SetBussTabText(str);
} /// <summary>
/// 设置第一级"聊天"菜单文本
/// </summary>
/// <param name="str"></param>
internal static void SetHomeTabText(string str)
{
mainWindow.SetHomeTabText(str);
} /// <summary>
/// 更新子菜单
/// </summary>
internal static void SetHomeTabSubText()
{
mainWindow.SetHomeSubTabText();
}
SetHomeSubTabText是更新子菜单,在MainWindow中实现,代码形如:
public void SetHomeSubTabText()
{
Link lkChat = new Link();
lkChat.DisplayName = "Contact";
lkChat.Source = new Uri(@"/Pages/Home.xaml", UriKind.Relative); ;
tabHome.Links.Add(lkChat);
Link lkMucChat = new Link();
lkMucChat.DisplayName = "Group Chat";
lkMucChat.Source = new Uri(@"/Pages/MucHome.xaml", UriKind.Relative); ;
tabHome.Links.Add(lkMucChat);
......
}
登陆后,进入的UI是Home.xmal,UI初始化的逻辑是左侧的列表由本地数据库查询生成,形成初始左侧List UI,自动绑定数据源
LeftListView.ItemsSource = itemsList; 消息、IQ的监听事件也在该方法进行:
private void BuildUI()
{
UIStatic.mainHome = this; if (Config.IsCheckPresence)
{
XmppStatic.xmppCon.OnRosterStart += new ObjectHandler(xmppCon_OnRosterStart);
XmppStatic.xmppCon.OnRosterItem += new XmppClientConnection.RosterHandler(xmppCon_OnRosterItem);
XmppStatic.xmppCon.OnRosterEnd += new ObjectHandler(xmppCon_OnRosterEnd);
XmppStatic.xmppCon.OnPresence += new PresenceHandler(xmppCon_OnPresence);
}
XmppStatic.xmppCon.OnIq += new IqHandler(xmppCon_OnIq);
XmppStatic.xmppCon.OnMessage += new MessageHandler(xmppCon_OnMessage); LoadListViewDataFromDB();
LeftListView.ItemsSource = itemsList; if (!Config.IsDebug)
{
LogTextBox.Visibility = System.Windows.Visibility.Hidden;
LogTextBox.Height = ;
}
}
当新消息到来,在HandleMessage中处理。
private void HandleMessage()
{
if (NewestMSG.Type == MessageType.chat)//单聊
{
SetChatPanelUI(new ChatRoom(NewestMSG.From.Bare, NewestMSG.From.Bare));
UpdateMessageArea();
}
else //系统消息
{
if (NewestMSG.Type == MessageType.groupchat) // MUC服务
{
SetChatPanelUI(new MUChatRoom(NewestMSG.From.Bare, NewestMSG.Body.ToString()));
UpdateMessageArea(); }
else if (NewestMSG.Type == MessageType.error) // Error
{ }
else //公告
{......
代码下载地址:https://lightchat.codeplex.com/
WPF一步步开发XMPP IM客户端2:主窗体设计的更多相关文章
- WPF一步步开发XMPP IM客户端1:入门
[起因&目标] 因为工作原因接触openfire服务端和spark客户端开发,主要是基于openfire扩展开发了针对企业用途的服务器插件,还开发了各个平台上的客户端(Windows\mac\ ...
- 一步步开发自己的博客 .NET版(3、注册登录功能)
前言 这次开发的博客主要功能或特点: 第一:可以兼容各终端,特别是手机端. 第二:到时会用到大量html5,炫啊. 第三:导入博客园的精华文章,并做分类.(不要封我) 第四:做 ...
- 一步步开发自己的博客 .NET版 剧终篇(6、响应式布局 和 自定义样式)
前言 这次开发的博客主要功能或特点: 第一:可以兼容各终端,特别是手机端. 第二:到时会用到大量html5,炫啊. 第三:导入博客园的精华文章,并做分类.(不要封我) 第四:做 ...
- 基于 SailingEase WinForm Framework 开发优秀的客户端应用程序(1:概述)
本系统文章将详细阐述客户端应用程序的设计理念,实现方法. 本系列文章以 SailingEase WinForm Framework 为基础进行设计并实现,但其中的设计理念及方法,亦适用于任何类型的客 ...
- Converse.js – 开源的 XMPP 聊天客户端
Converse.js 是一个运行在浏览器的免费和开源的聊天客户端.它可以集成到任何网页.类似于 Facebook 的聊天,它也支持多用户聊天室.Converse.js 可以连接到任何可访问的 XMP ...
- 一步步开发自己的博客 .NET版(1、基本显示)
前言 我们每个猿都有一个搭建自己独立博客的梦,我也不例外.以前想 现在想 以后也想.之所以一直迟迟没有着手,是因为难以跨出第一步.每次心里想着,等我以后技术好了再说,然后就没有然后了.以前用过word ...
- 一步步开发自己的博客 .NET版(4、文章发布功能)百度编辑器
前言 这次开发的博客主要功能或特点: 第一:可以兼容各终端,特别是手机端. 第二:到时会用到大量html5,炫啊. 第三:导入博客园的精华文章,并做分类.(不要封我) 第四:做个插件,任何网站上的技术 ...
- 一步步开发自己的博客 .NET版(5、Lucenne.Net 和 必应站内搜索)
前言 这次开发的博客主要功能或特点: 第一:可以兼容各终端,特别是手机端. 第二:到时会用到大量html5,炫啊. 第三:导入博客园的精华文章,并做分类.(不要封我) 第四:做 ...
- 基于 SailingEase WinForm Framework 开发优秀的客户端应用程序(目录)
本系统文章将详细阐述客户端应用程序的设计理念,实现方法. 本系列文章以 SailingEase WinForm Framework 为基础进行设计并实现,但其中的设计理念及方法,亦适用于任何类型的客 ...
随机推荐
- Unicode、UTF-8 和 ISO8859-1
Unicode.UTF-8 和 ISO8859-1到底有什么区别 1.本文主要包括以下几个方面:编码基本知识,java,系统软件,url,工具软件等. 在下面的描述中,将以"中文" ...
- 2018.10.09 NOIP模拟 好数(双向搜索)
传送门 直接双向搜索出两边可行解,然后把两边的可行解合并起来得出答案就行了. 注意合并的时候可以利用排序和单调性优化时间复杂度. 直接枚举合并是O(siza∗sizb)O(siza*sizb)O(si ...
- modelsim读写TXT文件
//open the file Initial Begin step_file = $fopen("F:/Company/Src/txt/step.v","r" ...
- NHibernate的搭建
1.新建项目 Business:业务逻辑类 Data:数据层,存放数据库的操作及Nhibernate辅助类 Domain:数据实体和数据库映射文件 2.使用NuGet下载Nhibernate 数据库配 ...
- mysql insert 事务相关(草稿)
当 insert 多条语句时初步试了一下是自带事务机制的,如在一个这样的表中: 执行语句 INSERT INTO `t_mytest`(`id`) VALUES (1),(2),(3),(4),(5) ...
- 深入理解BS结构应用程序
随着学习的深入,和编程经验的丰富,对BS应用程序有一些认识. 在一些讨论软件技术的QQ群里,或一些社区.BBS中,经常会有一些初学者会犯一些认知性的错误.比如经常会有一些朋友提这样的一些问题:“我怎么 ...
- 11i AP & GL 月末对账时常用系统报表
11i AP & GL 月末对账时常用系统报表 http://www.cnblogs.com/benio/archive/2011/10/14/2212169.html AP: 1.Invo ...
- 【笔记】virtualbox+arch+kde5安装流水账
正常安装就是RTFD就行了,不行辅助这几个链接也行: 我先把整个脚本[1]放这里: loadkeys us parted mkfs.ext4 /dev/sda1mkfs.ext4 /dev/sda3 ...
- Jersey Client传递中文参数
客户端需要客户端的包: <dependency> <groupId>com.sun.jersey</groupId> <artifactId>jerse ...
- jQuery插件开发的五种形态小结
关于jQuery插件的开发自己也做了少许研究,自己也写过多个插件,在自己的团队了也分享过一次关于插件的课.开始的时候整觉的很复杂的代码,现在再次看的时候就清晰了许多.这里我把我自己总结出来的东西分享出 ...