SilverLight搭建WCF聊天室详细过程(九)接收文本消息
时间:2010-12-26 来源:fugitiver
上一节为大家讲解了发送消息思路,既然发送消息为拆分xaml过程,那接收消息就是组装过程,先给出流程图:
流程图讲解:用户发送消息先调用WCF接口函数message(),同时调用rMessage()函数用来生成自己发送消息到自己的聊天窗口显示,服务端查找接收方通道然后回调客户端,客户端调用rMessage()函数生成聊天内容。
主要代码:

//姓名和时间
string nameTime = null;
string contentEach = null;
string nameColor = "red";
public void rMessage(string sendUser, string content, string sendTime)
{
//姓名和时间颜色
nameColor = (sendUser == operation.currentUserName) ? "red" : "blue";
//姓名和时间
nameTime = "<Paragraph xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\" FontSize=\"16\" Foreground=\"" + nameColor + "\"><Run Text=\"" + sendUser + " " + sendTime + "\" /></Paragraph>";
rtbReceiveContent.Blocks.Add((Paragraph)System.Windows.Markup.XamlReader.Load(nameTime));
//richtextbox每段消息都存放在<Paragraph>里,循环每段消息创建对象
while (content.Contains("Paragraph"))
{
contentEach = content.Substring(0, content.IndexOf("</Paragraph>") + 12);
content = content.Substring(content.IndexOf("</Paragraph>") + 12);
//在<Paragraph>里插入默认命名空间
contentEach = contentEach.Insert(10, " xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\" ");
rtbReceiveContent.Blocks.Add((Paragraph)System.Windows.Markup.XamlReader.Load(contentEach));
//让滚动条一直出于下方
rtbReceiveContent.SelectAll();
}
}
思路:先生成接收方姓名,根据接受方和发送方用不同颜色来显示名称,rtbReceiveContent.Blocks.Add((Paragraph)System.Windows.Markup.XamlReader.Load(nameTime));
这段代码我着重解释下,RichTextBox每段内容都可以用Block表示,而Blocks是block的一个内容集合,System.Windows.Markup.XamlReader.Load()这个函数可以在代码中执行xaml,所以我们可以很方便把xaml的<Paragraph>内容添加为一个Block块,这样就显示了一段内容,下面的while循环用来处理发送过来的xaml代码,因为我们发送的文本不可能只有一段内容,而每段内容都是一个<Paragraph></Paragraph>,看到这相信朋友们都想到了,可以用循环,每生成一段内容就把以生成的从接收到的内容流里删除,做这样的处理我们就可以很完整的还原发送方的显示状态。
注意:这里要提醒大家,因为发送时我们去掉了<Setion>,这样就不再存在明明空间,所以,我们要在每一段内容里插入" xmlns=\http://schemas.microsoft.com/winfx/2006/xaml/presentation\默认明明控件,位置就在“<Paragraph”后面。不然会出现异常。
rtbReceiveContent.SelectAll();在这里加上这个函数,因为动态添加Block时,RichTextBox的滚动条一直出于上方,我们没有办法控制滚动条位置,所以只能使用这个函数来让滚动条位置出于下方,也许会损失极小的效率,如果有朋友有别的解决办法可以留言,谢谢大家!
谢谢大家每次的意见,这次讲解占了大部分,希望对新手入门带来帮助,如果各位朋友觉得有所帮助,希望大家点下推荐,你们的支持才是我更新博客的动力,谢谢大家。
本节代码及数据库下载