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 为基础进行设计并实现,但其中的设计理念及方法,亦适用于任何类型的客 ...
随机推荐
- 2018.10.19 NOIP训练 游戏问题(分组背包)
传送门 分组背包经典问题. 令f[i][j]f[i][j]f[i][j]表示前iii组花费为jjj的最优值. g[i][j]g[i][j]g[i][j]表示前iii组,第iii组已经支付了平台费用的最 ...
- 2018.07.25 bzoj2125: 最短路(圆方树+倍增)
传送门 人生的第一道仙人掌. 这道题求是仙人掌上的最短路. 先建出圆方树,然后用倍增跑最短路,当lca" role="presentation" style=" ...
- 第六章 副词(Les adverbes )
副词属于不变词类,无性.数变化(tout除外),它的功能是修饰动词.形容词.副词或句子. ➡副词的构成 ⇨单一副词 bien tard hier mal vite tôt très souvent ...
- linux week3
2.如何快速的回到 上⼀一次所在的位置 cd An argument of - is equivalent to $OLDPWD. cd - #cd $OLDPWD cd - #快速的回到 上 ...
- ics
5.网分用法 时延测试: Format ->Delay Scale Ref -> AUTO SCALE Marker Search -> TRACKING[ON OFF]这样以后把M ...
- struts2从浅之深(一)简介
一.Struts2简介 1.Struts2概述 Struts2是Apache发行的MVC开源框架.注意:它只是表现层(MVC)框架. M:model-----数据 ...
- 使用LVM对系统盘进行扩容
不知道大家有没有碰到在安装CentOS时个,对系统每个挂载点分配多大容量比较合适的问题?如果挂载点容量分配大小,在某天不够用的时候怎么办:分配太大又存在浪费的情况.特别是在遇到系统盘特别小的时 ...
- hbase使用MapReduce操作4(实现将 HDFS 中的数据写入到 HBase 表中)
实现将 HDFS 中的数据写入到 HBase 表中 Runner类 package com.yjsj.hbase_mr2; import com.yjsj.hbase_mr2.ReadFruitFro ...
- 用 PHP 编写 http 服务器
概述 众所周知,我们一般使用 PHP 开发Web程序时需要使用到比如Apache或Nginx等Web服务器来支持,那么有没有办法直接使用PHP开发HTTP服务器,答案当然是可以的,最近看了一遍Work ...
- Spring容器中bean的生命周期以及关注spring bean对象的后置处理器:BeanPostProcessor(一个接口)
Spring IOC 容器对 Bean 的生命周期进行管理的过程: 1.通过构造器或工厂方法创建 Bean 实例 2.为 Bean 的属性设置值和对其他 Bean 的引用 3.将 Bean 实例传递给 ...