实现WPF消息对话框中文字高亮和链接跳转的方法
动手写一个简单的消息对话框,可以满足常见应用场景的需求。然而,对于需要部分关键字高亮或内容具有交互性的场景,现有的消息对话框无法满足。本文将介绍如何在WPF中实现消息对话框中局部文字内容高亮或者支持跳转。
使用HtmlTextBlock
在WPF中,可以使用
<Run>
或者
TextEffect
实现文字中部分关键字高亮,但无法同时满足部分内容支持链接跳转功能。为解决这一问题,可以采用支持有限HTML标签的WPF控件
HtmlTextBlock
。该控件可以支持
<b>
,
<u>
,
<i>
,
<a>
,
<br>
,
<font>
等标签,并新增了一个依赖属性
HtmlProperty
,接收需要展现的html内容。使用时需要把html内容字符串中的
<>
用
[]
代替。
Content="[font color=red]红色[/font]文字高亮";
<toolkit:HtmlTextBlock Margin="0,0,0,0" FontSize="18"
HorizontalAlignment="Center" VerticalAlignment="Center"
Html="{Binding Content}" />
需要注意的是,用
Html
绑定的内容中如果包含成对的英文方括号
[]
都会被当做标签处理,无论是否是上述支持的六种标签,都不会显示出来。中文方括号
【】
或者单个的英文方括号则会作为内容直接显示出来。如果用
Text
绑定内容则全部当成内容显示出来。
修改消息对话框
在原有消息对话框中,内容区域是使用可选中文本的控件
SelectableTextBlock
显示内容。只需将
SelectableTextBlock
替换为
HtmlTextBlock
,并用依赖属性
HtmlProperty
绑定内容即可。调用的时候只需把内容改为带标签的内容即可。例如:
ShowAlertDialog(AlertDialogMode.Normal, AlertDialogType.Info, "打开[a href=https://www.chinadaily.com.cn/]中国日报[/a]网站", yesbuttonText: "确定", nobuttonText: "取消", parent: this);
然而,在使用
<a>
标签实现链接跳转时并没有用浏览器打开指定页面。需要对代码稍作修改,使得
Hyperlink
能够导航到
NavigateUri
属性的值。
if (currentState.HyperLink != null && currentState.HyperLink.Length > 0)
{
Hyperlink link = new Hyperlink(retVal);
try
{
link.Click += new RoutedEventHandler((s, e) =>
{
Process.Start(new ProcessStartInfo((s as Hyperlink).NavigateUri.AbsoluteUri));
e.Handled = true;
});
}
catch(Exception ex)
{
.....
}
retVal = link;
}