zoukankan      html  css  js  c++  java
  • 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);
                       
                    } 
                   
                }

                       需要原代码的可以留下邮箱地址,我发给你们。

  • 相关阅读:
    C++基础学习1: C++布尔类型
    Hadoop-Yarn-框架原理及运作机制
    mapreduce shuffle 和sort 详解
    线程生命周期
    JVM 内存模型及垃圾回收
    利用Hive分析nginx日志
    mysql 30大优化策略
    hive 分组排序,topN
    Java核心卷笔记(一)
    Java 核心卷学习笔记(一)
  • 原文地址:https://www.cnblogs.com/zhangfan19900327/p/3101914.html
Copyright © 2011-2022 走看看