在新闻、留言板等系统中一种常见的需求是,保存用户的输入到数据库,显示时不能丢失格式。

转载请注明出处:http://www.cnblogs.com/brooks-dotnet/archive/2010/11/10/1874181.html

 

Silverlight 4 提供了一个RichTextBox控件,可以输入一些富文本信息,如超链接、图片等,并可以设置格式。RichTextBox提供了一个Xaml 属性,获取或设置 RichTextBox 中内容的 XAML 表示形式。

Xaml 属性返回的 XAML 字符串将只包括以下元素:(摘自MSDN)

虽然已经包括了大部分的元素,但是缺少一个关键的元素:图片。很多信息都是图文并茂的,这样用RichTextBox显示图片就有点困难了。且由于Silverlight是客户端技术,对访问本地资源有严格的安全性限制,Silverlight 4 只有在提升权限的情况下才可以访问系统剪切板中的部分元素。在Silverlight 4 中,只能粘贴剪切板中的文字信息,不能粘贴图片,且内容格式全部丢失。经过多方查找资料、测试,我找到两种解决方案。

一、第三方组件:SLaBv0.9

这里查看作者的博客。RichTextBox还有一个属性:Blocks。

Blocks 属性是 RichTextBox 的内容属性。它是 Paragraph 元素的集合。每个 Paragraph 元素中的内容都可包含下列元素:

InlineUIContainer 可包含 UIElement,例如 Image  Button

Span  Inline 元素的集合。

这个组件的作者实现了一个Xaml的序列化、反序列化类,能够从Blocks中提取出图片,在需要时显示,可以参考他的源代码。

我写了一个简单的测试程序,在RichTextBox中输入内容后,点击预览按钮查看:

Silverlight RichTextBox 保存格式解决方案

 

将RichTextBox的Blocks作为属性传递给预览窗口:

this.PreviewWindow = new QuestionPreview(this.txt问题描述.Blocks);
this.PreviewWindow.Show();

 

  

在预览窗口中进行解析:

        private void fnBlockParse()
        {
            UiXamlSerializer uxs 
= new UiXamlSerializer();
            ObservableObjectCollection ooc 
= new ObservableObjectCollection();
            
foreach (Block b in this.blocks)
            {
                ooc.Add(b);
            }
            
string xaml = uxs.Serialize(ooc);
            ObservableObjectCollection bc 
= (ObservableObjectCollection)XamlReader.Load(xaml);
            
this.txt预览.Blocks.Clear();
            
foreach (Block b in bc)
            {
                
this.txt预览.Blocks.Add(b);
            }
        }

相关文章: