SilverLight搭建WCF聊天室详细过程(十一)发送图片
时间:2010-12-26 来源:fugitiver
上一节为大家讲解了离线消息的收发过程,到此,文本消息的发送暂时完成,后面我们会讲到一些代码优化,这节内容应该是大家最关心的发送图片问题,SilverLight4版本相对以前版本有了很大改进,以前的版本只能访问我的文档之类的低限制文件夹,现在我们可以访问我们电脑上大部分文件夹,只是这种访问必须由用户产生选择文件对话窗,不能由程序隐式访问,不过,已经足够我们实现文件的上传和下载了。
虽然我们无法序列化复杂控件,但是我们可以把图片等简单控件序列化称二进制流,这给图片,文件传输带来很大方便,本文就是利用图片的二进制序列化达到WCF传输目的。
1.先看下流程图:
流程图讲解:用户选择一个图片,调用WCF的picture()接口函数,从而访问服务端的picture()函数实现,如何返回图片我们下界会继续讲,同时我们要生成发送方的图片在RichTextBox显示,这样我们就不必再浪费资源从服务端返回,直接调用creatImage()函数把二进制流转换成图片,并添加到RichTextBox中。
给出关键代码:

{
operation.opd.Filter = "Image Files|*.jpg;*.bmp;*.png";
if (operation.opd.ShowDialog() == true)
{
Stream stream = (Stream)operation.opd.File.OpenRead();
byte[] bytes = new byte[stream.Length];
stream.Read(bytes, 0, (int)stream.Length);
//发送图片
operation.prox.pictureAsync(tbChatName.Text.ToString(), bytes);
//创建图片
creatImage(operation.currentUserName, stream);
}
}
private void creatImage(string sendUser, Stream stream)//创建图片
{
rMessage(sendUser, "", System.DateTime.Now.ToLongTimeString());//添加发送用户名和时间
BitmapImage bitmapImage = new BitmapImage();
bitmapImage.SetSource(stream);//生成图片流
Image image = new Image();
image.Source = bitmapImage;//把图片赋值给图片作为图片源
Paragraph paragraph = new Paragraph();//生成RichTextBox段落
InlineUIContainer ui = new InlineUIContainer();//生成内联图片
ui.Child = image;
paragraph.Inlines.Add(ui);//内联图片添加到段落
rtbReceiveContent.Blocks.Add(paragraph);//段落添加到富文本框
rtbReceiveContent.SelectAll();//保证滚动条在最下方
}
思路,首先由用户选择要发送的图片,当发送图片确认后我们就可以打开文件流Stream stream = (Stream)operation.opd.File.OpenRead();
,从而在定义好的byte[]数组中我们写入图片数据流生成二进制数据流,最后将二进制数据流发送到服务端,同时调用客户端函数生成图片并显示到RichTextBox中,添加到RichTextBox控件中的过程,我们在前面介绍过<Paragraph>类,这个类表示一个段落,从而就可以把图片看成段落内容添加到Blocks集合中。