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 为基础进行设计并实现,但其中的设计理念及方法,亦适用于任何类型的客 ...
随机推荐
- mybatis 传参为 Integer 时 ,Mapper 文件 中判断 条件 问题。
<if test="valiStatus==null || valiStatus=='' || valiStatus==4 "> b.work_permit_card_ ...
- springmvc 返回汉字乱码
1.删除配置文件中的<mvc:annotation-driven /> 2.添加如下配置 <bean class="org.springframework.web.ser ...
- Oracle sql的基本优化写法和思路。
首先简单介绍下常规的sql优化的方式: 1.肯定有人说建索引啊. 2.数据量实在太大,建分区啊. 3.其实基于目前公司的业务还有一种办法那就是向上聚集表.根据查询业务,专门抽取上来一张表,直接做到se ...
- 【Jsoup】Jsoup解析Html标签(Java后台解析)
中文API网站(下载地址): http://www.open-open.com/jsoup/ 有时候编辑器传到后台的内容是带Html标签的,或者有时候需要形成一个完整的Html文档,也或者需要解析其中 ...
- 2018.08.27 [Usaco2017 Jan]Promotion Counting(线段树合并)
描述 The cows have once again tried to form a startup company, failing to remember from past experienc ...
- UVa 11384 Help is needed for Dexter (递归)
题意:给定一个n表示1到n的序列,让你用最小的步数把这个序列都变为0,每个操作可以从序列中选择一个或多个个,同时减掉一个正整数,求最少的步数. 析:一看这个题,感觉挺高深的,但是静下心来想想,其实挺简 ...
- 如何使用masonry设计复合型cell[转]
前言 其实早在@sunnyxx同学发布UIView-FDCollapsibleConstraints的时候 我就说要写一下怎么用代码来稍微麻烦的实现复用的问题 但是一直各种没时间(主要是我的办法太复杂 ...
- MapGIS Mobile开发
1. 先将Android开发环境配置好(包括Java + Eclipse + Android SDK) 2. 加载API类库(运行MapGIS 10 AndroidSDK.exe可以加载Mobile框 ...
- (KMP 模板)Number Sequence -- Hdu -- 1711
http://acm.hdu.edu.cn/showproblem.php?pid=1711 Number Sequence Time Limit: 10000/5000 MS (Java/Other ...
- (深搜)Sum It Up -- poj --1564
链接: http://poj.org/problem?id=1564 http://acm.hust.edu.cn/vjudge/contest/view.action?cid=88230#probl ...