• 【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

  • 相关阅读:
    安卓读取SD卡的容量
    Eclipse常用快捷键
    安卓实现记住密码登陆功能
    eclipse DDMS导出文件失败--android Failed to push the item
    LinearLayout线性布局搭配权重属性的使用
    unity 天空盒有缝隙的解决方案
    unity gitignore
    unity 5.6.1 Oculus手柄输入问题
    两个长整形相除等于零
    Unity 获得视频的某一帧,生成缩略图
  • 原文地址:https://www.cnblogs.com/bomo/p/4320595.html
Copyright © 2020-2023  润新知