我最开始的思路是用几个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.筛选方法:
string abc = "大家好,hello,希望大家喜欢[disdain],开心哦[joyful]哈哈哈!"; //我们要转换成文字加图片的内容
public MainPage()
{
InitializeComponent();
ObservableCollection<FaceItem> faceItemList = new ObservableCollection<FaceItem>();
FaceItem item1 = new FaceItem { FaceName = "[disdain]", FaceUri = "Emotions/[disdain].png" };
FaceItem item2 = new FaceItem { FaceName = "[joyful]", FaceUri = "Emotions/[joyful].png" };
faceItemList.Add(item1);
faceItemList.Add(item2);
this.FaceList.ItemsSource = faceItemList;
char[] abcs = abc.ToCharArray(); //将需要转换的内容转换成char数组,便于我们进行筛选操作,例如:“大家好,hello,希望大家喜欢[disdain],开心哦[joyful]哈哈哈!”
string strs = ""; //文字(非"[]"类型的文字) 例如:“大家好,hello,希望大家喜欢”
string strface = ""; //图片("[]"类型的文字) 例如:“[disdain]”
List<string> list = new List<string>(); //我们把文字和图片放入其中,最后我们通过遍历这个list来动态为richbox添加内容
for (int i = 0; i < abcs.Count(); i++)
{
if (abcs[i].ToString() != "[")
{
for (int j = 0; j < abcs.Count() - i ; j++)
{
if (abcs[i + j].ToString() != "[")
{
strs = strs + abcs[i + j].ToString();
if (i + j == abcs.Count()-1)
{
if (abcs[i+j].ToString()!="]")
{
i = i + j ;
break;
}
}
}
else
{
i = i + j-1;
break;
}
}
if (strs!="")
{
list.Add(strs);
strs = "";
}
}
if (abcs[i].ToString() == "[")
{
for (int j = 0; j < abcs.Count()-i; j++)
{
if (abcs[i + j].ToString() != "]")
{
strface = strface + abcs[i + j].ToString();
}
if (abcs[i + j].ToString() == "]")
{
strface = strface + abcs[i + j].ToString();
i = i + j;
break;
}
}
FaceItem itemnew = new FaceItem { FaceName = strface, FaceUri = "Emotions/" + strface + ".png" };
if (true)
{
list.Add(strface);
strface = "";
}
}
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);
}
}