之前写过一篇WP8下的富文本的文章,但是写的不是很好,整理了一下,分享一下WP8.1下的富文本处理

富文本处理主要是对表情和链接的处理,一般使用RichTextBlock进行呈现

问题说明:

  由于RichTextBlock内部的元素不是普通的FrameworkElement,而是继承自TextElement,FrameworkElement的一些属性不支持

  当HyperLink设置了NavigateUri属性时,其默认的行为是跳转到外部的IE浏览器

  有时候我们需要自定义HyperLink的行为,例如QQ:当点击富文本的链接时,弹出ContextMenu,或者调到内部的浏览器,或者调到指定页面

  所以不能设置NavigateUri值,通过Click事件处理相关逻辑,我们需要把链接的值传到Click事件中,这里我用了附加属性给HyperLink附加一个属性,以保证在Click事件能取到导航的值

下面是代码

  表情和链接的解析用正则表达式

1、定义附加属性的类

    public class HyperLinkExtensions
{
public static readonly DependencyProperty NavigateUrlProperty = DependencyProperty.Register(
"NavigateUrl", typeof (string), typeof (HyperLinkExtensions), new PropertyMetadata(default(string))); public static string GetNavigateUrl(Hyperlink element)
{
return (string)element.GetValue(NavigateUrlProperty);
} /// <summary>
/// 为HyperLink附加NavigateUrl属性
/// </summary>
public static void SetNavigateUrl(Hyperlink element, string value)
{
element.SetValue(NavigateUrlProperty, value);
}
}

2、Xaml

<Grid>
<RichTextBlock FontSize="25" x:Name="Rtb"/>
</Grid>

3、富文本处理

    //表情字典,表情转文件名
private readonly Dictionary<string, string> emojiDict = new Dictionary<string, string>
{
{"大笑", "daxiao"},
{"大哭", "daku"},
}; /// <summary>
/// 文本转富文本
/// 表情为格式为:{表情}
/// 链接格式为:<a href="http://www.baidu.com">百度</a>
/// </summary>
private Paragraph AnalyzeText(string richText)
{
richText = Regex.Replace(richText, "{(?<emoji>[^}]+)}|<a[^>]*?>(?<link_title>[^<]*?)</a>", i =>
{
if (!string.IsNullOrEmpty(i.Groups["link_title"].Value))
{
const string link =
@"<Hyperlink Foreground=""{{StaticResource PhoneAccentBrush}}"" NavigateUri=""http://www.baidu.com"">
<Underline>{0}</Underline>
</Hyperlink>";
return string.Format(link, i.Groups["link_title"].Value);
}
if (!string.IsNullOrEmpty(i.Groups["emoji"].Value))
{
const string image = @"<InlineUIContainer>
<Image Source=""/Assets/Emoji/{0}.png"" Width=""30"" VerticalAlignment=""Center""/>
</InlineUIContainer>";
return string.Format(image, emojiDict[i.Groups["emoji"].Value]);
} return string.Empty;
}); const string paragraph = @"<Paragraph
xmlns=""http://schemas.microsoft.com/winfx/2006/xaml/presentation""
xmlns:x=""http://schemas.microsoft.com/winfx/2006/xaml"">
{0}
</Paragraph>"; var p = (Paragraph)XamlReader.Load(string.Format(paragraph, richText)); HandleHyperlink(p);
return p;
} /// <summary>
/// 处理点击事件
/// </summary>
/// <param name="p"></param>
private void HandleHyperlink(Paragraph p)
{
foreach (var inline in p.Inlines)
{
var link = inline as Hyperlink;
if (link != null)
{
HyperLinkExtensions.SetNavigateUrl(link, link.NavigateUri.OriginalString);
link.NavigateUri = null;
link.Click += link_Click;
}
}
} private async void link_Click(Hyperlink sender, HyperlinkClickEventArgs args)
{
var uri = HyperLinkExtensions.GetNavigateUrl(sender);
//这里定义点击事件
await new MessageDialog(uri).ShowAsync();
}

4、测试

    private void Test()
{
var richText = @"2015年喽嘻嘻~~新年新气象,三羊开泰,诸事喜气洋洋。GO~,发红包啦<a href=""http://www.baidu.com"">点我领红包</a>{大笑}哈哈{大哭}呜呜"; var p = AnalyzeText(richText);
Rtb.Blocks.Add(p);
}

5、结果

Demo:http://files.cnblogs.com/files/bomo/RichTextDemo8.1.zip

声明:转载请注明出处  http://www.cnblogs.com/bomo/p/4320595.html

【WP8.1】富文本的更多相关文章

  1. 【WP8】富文本功能实现

    2014年8月1日更新:修复如果有多个相同链接解析失败的Bug,谢谢 @Walsh 提供的问题 富文本在移动APP上应用的最多的就是表情了,类似微博,QQ,微信都有对提供对表情和链接的支持,富文本一般 ...

  2. 富文本编辑器Simditor的简易使用

    最近打算自己做一个博客系统,并不打算使用帝国cms或者wordpress之类的做后台管理!自己处于学习阶段也就想把从前台到后台一起谢了.好了,废话不多说了,先来看看富文本编辑器SimDitor,这里是 ...

  3. 个人网站对xss跨站脚本攻击(重点是富文本编辑器情况)和sql注入攻击的防范

    昨天本博客受到了xss跨站脚本注入攻击,3分钟攻陷--其实攻击者进攻的手法很简单,没啥技术含量.只能感叹自己之前竟然完全没防范. 这是数据库里留下的一些记录.最后那人弄了一个无限循环弹出框的脚本,估计 ...

  4. 图解DevExpress RichEditControl富文本的使用,附源码及官方API

    9点半了,刚写到1.2.   该回家了,明天继续写完. 大家还需要什么操作,留言说一下,没有的我明天继续加. 好久没有玩DevExpress了,今天下载了一个玩玩,发现竟然更新到14.2.5了..我去 ...

  5. jsp富文本图片和数据上传

    好记性不如烂笔头,记录一下. 2016的最后一天,以一篇博客结尾迎接新的一年. 此处用的富文本编辑器是wangEditor,一款开源的轻量级的富文本编辑器,这里着重说一下里面的图片上传功能. 服务器端 ...

  6. UEditor百度富文本编辑器--让编辑器自适应宽度的解决方案

    UEditor百度富文本编辑器的initialFrameWidth属性,默认值是1000. 不能够自适应屏幕宽度.如图1: 刚开始的时候,我是直接设置initialFrameWidth=null的.效 ...

  7. iOS - NSMutableAttributedString富文本的实现

    NSMutableAttributedString继承于NSAttributedString(带属性的字符串)能够简单快速实现富文本的效果;不多说直接上效果图和代码,通俗易懂: (一)效果图: (二) ...

  8. 【代码笔记】iOS-获得富文本设置以后的文字高度

    一,效果图. 二,工程图. 三,代码. RootViewController.h #import <UIKit/UIKit.h> @interface RootViewController ...

  9. PHP Ueditor 富文本编辑器

    2016年12月11日 08:46:59 星期日 百度的简版富文本编辑器umeditor很久没更新了 全功能版本的配置项跟umeditor还是有区别的, 这里说下ueditor怎么对接到项目中去, 主 ...

随机推荐

  1. easyui中 在子tabs中 添加新的tabs

    function addToParentTab(title, url) {            self.parent.addTabIgnoreExist(title, url, 'icon-cha ...

  2. 【LeetCode】263. Ugly Number

    Ugly Number Write a program to check whether a given number is an ugly number. Ugly numbers are posi ...

  3. oracle中查询某张表都被哪些表参照了

    起因: 系统测试的时候发现如果某条记录已经被引用了,这个时候删除这条记录会引起数据不一致,系统会报错.比如警员信息,在考勤记录表里会引用警员ID,如果考勤记录表中已经存在这个警员ID了,这时从警员表中 ...

  4. webdriver实用指南迁移至gitbbok并改名为selenium webdriver从入门到提高

    背景 几年前我写了一本关于selenium webdriver的小册子,主要讲了一些selenium在进行测试过程中会遇到的场景以及解决方案,陆陆续续在github上收到了100+的star,在这里我 ...

  5. 苹果 Mac OS 下查看系统隐藏文件

    Mac OS X中有很多系统隐藏的信息文件, 一般在Finder中都是看不到,也修改不了的. 但通过在"终端"中输入命令, 就可以在Finder中显示出来: defaults wr ...

  6. 面向.Net程序员的前端优化

    背景 作为web开发人员大家大多了解一些网站的性能优化方法,其实大部分方法都不复杂,例如针对前端js和css的压缩来减少请求大小,通过合并来减少请求次数.这里站在.Net后端程序员的角度来看一下如何最 ...

  7. 读写文本(.txt)文件 .NET

    http://www.cnblogs.com/jx270/archive/2013/04/14/3020456.html (一) 读取文件 如果你要读取的文件内容不是很多,可以使用 File.Read ...

  8. linux的文件种类与扩展名

    一.文件种类: 1.普通文件(regular file)第一个字符为[ - ] 包括:①纯文本档(ASCII):这是Linux系统中最多的一种文件类型,称为纯文本档.是因为内容为我们人类可以直接读到的 ...

  9. java 使用 ScriptEngineManager 解析逻辑表达式

    将表达式替换成js使用的文本格式.然后带入eval函数. public class JieXi { public static void main(String[] args) throws Exce ...

  10. 跟随标准与Webkit源码探究DOM -- 获取元素之getElementsByTagName

    按照标签名获取元素 -- getElementsByTagName 标准 DOM 1在Element和Document两个interface中均有定义,原型NodeList getElementsBy ...