【WP8.1】富文本

  之前写过一篇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

时间: 2024-12-23 19:28:39

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

【WP8】富文本功能实现

富文本在移动APP上应用的最多的就是表情了,类似微博,QQ,微信都有对提供对表情和链接的支持,富文本一般包括:文本,表情,超链接 WP上没有提供对富文本的直接编辑,富文本是通过字符串进行转换的,例如:QQ上的表情用斜杠标识(例如:/哈哈),微博上的表情用中括号标识(例如:[兔子]) 本文实现富文本的思路是: 表情:通过构造正则表达式,匹配相关的表情标识,并替换成相关的表情图片 链接:通过正则表达式匹配以http://或https://开头的一连串的ASCII字符(空格除外) 在msdn看到Ric

微信小程序富文本-wxParse的使用

最近小程序蛮火的,公司要做于是学了一点点小程序 不知道你们有没有遇到过这种问题: 从公司服务器获取的文章内容是有HTML标签格式的一段内容,但是微信是不支持这些标签的,怎么办呢? 1.一般网站后台的文章是这样的,带有很多的html标签(这里是截取的今日头条某文章内容),但是小程序并不支持,它会以文本直接显示 怎么办呢? 2.在这个时候可以考虑 wxParse wxParse信息 版本号0.1 历史版本号0.2 具体代码请查看仓库分支V1 github地址: https://github.com/

TinyMCE(富文本编辑器)

[转]TinyMCE(富文本编辑器)在Asp.Net中的使用方法 官网演示以及示例代码:https://www.tinymce.com/docs/demo/image-tools/ 转自:http://www.cnblogs.com/hahacjh/archive/2010/07/24/1784268.html TinyMCE 在Asp.Net中的使用方法其实挺简单的,从官方网站下载TinyMCE),然后将里面的jscripts目录拷到你的网站目录 假设你的aspx页面中某一个地方需要用到编辑器

Java 实现HTML富文本导出至word完美解决方案

一. 问题的提出 最近用java开发一个科技项目信息管理系统,里面有一个根据项目申请书的模板填写项目申报信息的功能,有一个科技项目申请书word导出功能. 已有的实现方式:采用标准的jsp模板输出实现,简单地说,就是把数据渲染进jsp页面,然后将此页面另存为doc文档,从而达到word导出效果.但是存在以下几个问题: (1) 由于导出的html网页格式,打开word后,默认显示的视图模式为WEB版式视图: (2) 修改word文档后,会新增一个相关联的文件夹,word的html中会引用这个文件夹

Android富文本编辑器RichEditor的使用

以前有个项目做一个笔记本类似的东西,觉得写的不太好,最近重新写,就发现了这个富文本编辑器他的效果是这样的 感觉有点厉害啊 废话不多说开始撸码 1先添加依赖 dependencies { compile 'jp.wasabeef:richeditor-android:1.2.0' } 2写布局 <jp.wasabeef.richeditor.RichEditor android:id="@+id/editor" android:layout_width="match_pa

C# 富文本的使用

一般使用的是百度富文本编辑器: http://ueditor.baidu.com/website/download.html           下载地址 使用方法: 前台 后台:

商城项目整理(四)JDBC+富文本编辑器实现商品增加,样式设置,和修改

UEditor富文本编辑器:http://ueditor.baidu.com/website/ 相应页面展示: 商品添加: 商品修改: 前台商品展示: 商品表建表语句: 1 create table TEST.GOODS_TABLE 2 ( 3 gid NUMBER not null, 4 gname VARCHAR2(90), 5 gdetails CLOB, 6 gpicture VARCHAR2(100), 7 gprice NUMBER, 8 gleixing NUMBER, 9 gpi

关于富文本编辑器UEditor

2017.1.18,星期三?     关于富文本编辑器:     富文本编辑器,Rich Text Editor, 简称 RTE, 是一种可内嵌于浏览器,所见即所得的文本编辑器. 富文本编辑器不同于文本编辑器,程序员可到网上下载免费的富文本编辑器内嵌于自己的网站或程序里(当然付费的功能会更强大些),方便用户编辑文章或信息.比较好的文本编辑器有kindeditor,fckeditor等. 关于UEditor:官网                           UEditor文档,我们的说明书

ios中label富文本的设置

1.修改不同文字和颜色 // 创建一个富文本 NSMutableAttributedString *attri = [[NSMutableAttributedString alloc] initWithString:@"哈哈哈哈哈123456789"]; // 修改富文本中的不同文字的样式 [attri addAttribute:NSForegroundColorAttributeName value:[UIColor blueColor] range:NSMakeRange(0, 5