在开发WPF应用程序时,经常需要展示富文本信息,比如带有格式的消息、进度信息等。然而,WPF的原生控件TextBlock并不支持HTML标签的解析和显示。为了实现这一功能,可以创建一个自定义控件,使其能够解析并显示HTML标签。本文将介绍如何实现这样一个控件,并展示其使用方法。
在开发一个自定义进度对话框时,需要在对话框中展示带有格式的消息文本。TextBlock控件虽然功能强大,但它并不支持HTML标签的解析。尝试了使用WebBrowser控件,但这对于需求来说过于复杂。于是想起了几年前编写的一个项目,该项目尝试在.NET 2中重新创建FlowDocument,并加载HTML文档。这个项目名为QzMiniHtml2,经过少量修改后,它能够在WPF中正常工作。
这个自定义控件类似于TextBlock,但需要设置HTML属性而不是Text属性。请记住使用方括号[ ]而不是尖括号< >。以下是XAML代码示例:
<Window x:Class="HtmlTextBlockTestProj.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:uc="http://www.quickzip.org/UserControls"
Title="HtmlTextBlockTest" Height="250" Width="450">
<DockPanel>
<uc:HtmlTextBlock Html="{Binding Text, ElementName=tb}" DockPanel.Dock="Top" Loaded="HtmlTextBlock_Loaded" />
<TextBlock Text="[b] [i] [u] [a href=xx] [br] supported." DockPanel.Dock="Bottom" />
<TextBox TextWrapping="Wrap" AcceptsReturn="True" VerticalScrollBarVisibility="Visible" x:Name="tb" Text="The [i][u]quick brown fox[/i][/u] jumps over the [b]lazy dog[/b]" />
</DockPanel>
</Window>
在上面的代码中,定义了一个名为HtmlTextBlock的自定义控件,并将其放置在DockPanel中。还定义了一个TextBox控件,用于输入HTML格式的文本。
这个组件实际上包含了一个HTML解析引擎,它将HTML字符串转换为WPF的Bold、Italic、Underline、Hyperlink、LineBreak Inline等。以下是C#代码示例:
private Inline UpdateElement(HtmlTag aTag)
{
Inline retVal = null;
switch (aTag.Name)
{
case "text":
retVal = new Run(aTag["value"]);
if (currentState.Bold) retVal = new Bold(retVal);
if (currentState.Italic) retVal = new Italic(retVal);
if (currentState.Underline) retVal = new Underline(retVal);
break;
case "br":
retVal = new LineBreak();
break;
}
if (currentState.HyperLink != null && currentState.HyperLink != "")
{
Hyperlink link = new Hyperlink(retVal);
link.NavigateUri = new Uri(currentState.HyperLink);
retVal = link;
}
return retVal;
}