经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » HTML/CSS » HTML » 查看文章
[WPF]用HtmlTextBlock实现消息对话框的内容高亮和跳转
来源:cnblogs  作者:czwy  时间:2024/7/8 10:02:09  对本文有异议

动手写一个简单的消息对话框一文介绍了如何实现满足常见应用场景的消息对话框。但是内容区域的文字仅仅起到信息展示作用,对于需要部分关键字高亮,或者部分内容有交互性的场景(例如下图提示信息中的“what's the risk?”需要跳转)则无能为力了。本文将介绍如何在WPF中灵活的实现消息对话框中局部文字内容高亮或者支持跳转。
image

HtmlTextBlock的使用

在WPF中,可以采用<Run>或者TextEffect实现文字中部分关键字高亮,但无法同时满足部分内容支持链接跳转功能 。如果能直接使用HTML,问题就迎刃而解了,但是在消息对话框的内容区域放一个webbrowser或cef浏览器有点太臃肿了。WPF HTML Supported TextBlock分享了一个支持有限HTML标签的WPF控件。该控件可以支持<b>,<u>,<i>,<a>,<br>,<font>标签,派生自TextBlock控件,并新增了一个依赖属性HtmlProperty接收需要展现的html内容,使用时需要把html内容字符串中的<>[]代替。

  1. Content="[font color=red]红色[/font]文字高亮";
  2. <toolkit:HtmlTextBlock Margin="0,0,0,0" FontSize="18"
  3. HorizontalAlignment="Center" VerticalAlignment="Center"
  4. Html="{Binding Content}" />

需要注意的是,用Html绑定的内容中如果包含成对的英文方括号[]都会被当做标签处理,无论是否是上述支持的六种标签,都不会显示出来。中文方括号【】或者单个的英文方括号则会作为内容直接显示出来。如果用Text绑定内容则全部当成内容显示出来。

修改消息对话框

动手写一个简单的消息对话框中内容区域是使用可选中文本的控件SelectableTextBlock显示内容,只需全部替换为HtmlTextBlock,并用依赖属性HtmlProperty绑定内容即可。调用的时候只需把内容改为带标签的内容即可。例如:

  1. ShowAlertDialog(AlertDialogMode.Normal, AlertDialogType.Info, "打开[a href=https://www.chinadaily.com.cn/]中国日报[/a]网站", yesbuttonText: "确定", nobuttonText: "取消", parent: this);

但在使用<a>标签实现链接跳转时并没有用浏览器打开指定页面,调试过程中发现以下关键代码,可以看到HtmlTextBlock是把<a>转换为Hyperlink控件,并把href中的url赋值给NavigateUri达到跳转效果。

  1. private Inline UpdateElement(HtmlTag aTag)
  2. {
  3. Inline retVal = null;
  4. switch (aTag.Name)
  5. {
  6. case "text" :
  7. retVal = new Run(aTag["value"]);
  8. if (currentState.Bold) retVal = new Bold(retVal);
  9. if (currentState.Italic) retVal = new Italic(retVal);
  10. if (currentState.Underline) retVal = new Underline(retVal);
  11. break;
  12. case "br" :
  13. retVal = new LineBreak();
  14. break;
  15. }
  16. if (currentState.HyperLink != null && currentState.HyperLink != "")
  17. {
  18. Hyperlink link = new Hyperlink(retVal);
  19. link.NavigateUri = new Uri(currentState.HyperLink);
  20. retVal = link;
  21. }
  22. return retVal;
  23. }

然而,只有 Hyperlink的直接或间接父级为导航宿主时,Hyperlink才能导航到NavigateUri属性的值,导航宿主包括System.Windows.Navigation.NavigationWindowSystem.Windows.Controls.Frame或任何可承载 XBAP 的浏览器(包括 Internet Explorer 7、Microsoft Internet Explorer 6 和 Firefox2.0 以上版本)。因此,需要对这段代码稍作修改。

  1. if (currentState.HyperLink != null && currentState.HyperLink.Length > 0)
  2. {
  3. Hyperlink link = new Hyperlink(retVal);
  4. try
  5. {
  6. link.Click += new RoutedEventHandler((s, e) =>
  7. {
  8. Process.Start(new ProcessStartInfo((s as Hyperlink).NavigateUri.AbsoluteUri));
  9. e.Handled = true;
  10. });
  11. }
  12. catch(Exception ex)
  13. {
  14. .....
  15. }
  16. retVal = link;
  17. }

image

原文链接:https://www.cnblogs.com/czwy/p/18273976

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号