Windows phone中用RichTextBox实现文字、图片混合排版
看微博、或者qq空间时,经常能看到这种文字加图片的例子:
我最开始的思路是用几个stackpanel,几个TextBox,几个image来实现,实现起来很是麻烦。微软为我们提供了很好的解决方案,richtextbox就是很好的选择;具体可参考 http://msdn.microsoft.com/zh-cn/library/ee681613(v=VS.95).aspx 。
这里我简单实现了一下图文混排。
思路是这样的:首先我们希望能把图片文字,同一般的文字分离开来,便于我们生成文字还是图片。
例如: "大家好,hello,希望大家喜欢[disdain],开心哦[joyful]哈哈哈!"
我们可以把它拆分成 : "大家好,hello,希望大家喜欢" + "[disdain]" + ",开心哦" + "[joyful]" +"哈哈哈!"
其中第一个我们叫它一般字符,第二个表示图片的我们叫它图片字符。
于是我们希望定义一个数组来存这5个字段。于是我们定义一个string[] 数组
并且分别定义两个字符串来分别来赋值 一般字符 和 图片字符。
接下来就是一些筛选加判断将一般字符和图片字符分离开来,具体实现方法在我的代码里大家可以参考一下(方法有很多种,我的有些繁琐,欢迎大家分享一下更简便的方法。)
需要源代码的留下邮箱,我发给你们。
1.筛选方法:
1 string abc = "大家好,hello,希望大家喜欢[disdain],开心哦[joyful]哈哈哈!"; //我们要转换成文字加图片的内容 2 public MainPage() 3 { 4 InitializeComponent(); 5 6 ObservableCollection<FaceItem> faceItemList = new ObservableCollection<FaceItem>(); 7 8 FaceItem item1 = new FaceItem { FaceName = "[disdain]", FaceUri = "Emotions/[disdain].png" }; 9 10 FaceItem item2 = new FaceItem { FaceName = "[joyful]", FaceUri = "Emotions/[joyful].png" }; 11 12 faceItemList.Add(item1); 13 faceItemList.Add(item2); 14 15 this.FaceList.ItemsSource = faceItemList; 16 17 18 char[] abcs = abc.ToCharArray(); //将需要转换的内容转换成char数组,便于我们进行筛选操作,例如:“大家好,hello,希望大家喜欢[disdain],开心哦[joyful]哈哈哈!” 19 string strs = ""; //文字(非"[]"类型的文字) 例如:“大家好,hello,希望大家喜欢” 20 string strface = ""; //图片("[]"类型的文字) 例如:“[disdain]” 21 List<string> list = new List<string>(); //我们把文字和图片放入其中,最后我们通过遍历这个list来动态为richbox添加内容 22 for (int i = 0; i < abcs.Count(); i++) 23 { 24 if (abcs[i].ToString() != "[") 25 { 26 for (int j = 0; j < abcs.Count() - i ; j++) 27 { 28 if (abcs[i + j].ToString() != "[") 29 { 30 strs = strs + abcs[i + j].ToString(); 31 if (i + j == abcs.Count()-1) 32 { 33 if (abcs[i+j].ToString()!="]") 34 { 35 i = i + j ; 36 break; 37 } 38 } 39 } 40 else 41 { 42 i = i + j-1; 43 break; 44 } 45 46 } 47 if (strs!="") 48 { 49 list.Add(strs); 50 strs = ""; 51 } 52 } 53 if (abcs[i].ToString() == "[") 54 { 55 for (int j = 0; j < abcs.Count()-i; j++) 56 { 57 if (abcs[i + j].ToString() != "]") 58 { 59 strface = strface + abcs[i + j].ToString(); 60 61 } 62 if (abcs[i + j].ToString() == "]") 63 { 64 strface = strface + abcs[i + j].ToString(); 65 i = i + j; 66 break; 67 } 68 69 } 70 FaceItem itemnew = new FaceItem { FaceName = strface, FaceUri = "Emotions/" + strface + ".png" }; 71 if (true) 72 { 73 list.Add(strface); 74 strface = ""; 75 76 } 77 }
2. 下面是绘制内容:
//// 动态生成richbox内的内容 Paragraph ph = new Paragraph(); //放到for循环外面,因为只有一个段落就够了 content1.Blocks.Add(ph); //放入到richbox中 for (int i = 0; i < list.Count();i++ ) { if (list[i].ToString().StartsWith("[")) { // Run myRun= new Run(); InlineUIContainer iu = new InlineUIContainer(); Image im = new Image(); im.Source = new BitmapImage(new Uri("Emotions/" + list[i].ToString() + ".png", UriKind.RelativeOrAbsolute)); im.Height = 30; iu.Child = im; ph.Inlines.Add(iu); } else { Run myRun = new Run(); myRun.Text = list[i].ToString(); ph.Inlines.Add(myRun); } }
需要原代码的可以留下邮箱地址,我发给你们。