如何在 UWP 中将 HTML 转换为 RTF
How to convert HTML to RTF in UWP
我想在 UWP 中将 HTML 转换为 RichTextBlock。我在 Whosebug 中找到了一些答案尝试了以下 link
中的代码
但是,当我尝试在 richtextblock 控件中绑定 html 属性 时,它给出了错误提示,命名空间 "using XAMLHtml"[=15= 中不存在名称 "Properties" ]
我在 XAMLHtml.cs 文件
中加入了以下代码以将 HTML 转换为 RTF
class XAMLHtml
{
public class HtmlProperties : DependencyObject
{
public static readonly DependencyProperty HtmlProperty =
DependencyProperty.RegisterAttached(
"Html",
typeof(string),
typeof(HtmlProperties),
new PropertyMetadata(null, HtmlChanged));
private static RichTextBlock _currentObject;
private static void HtmlChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
var richText = d as RichTextBlock;
if (richText == null) return;
_currentObject = richText;
//Generate blocks
var xhtml = e.NewValue as string;
var blocks = GenerateBlocksForHtml(xhtml);
_currentObject = null;
//Add the blocks to the RichTextBlock
richText.Blocks.Clear();
foreach (var b in blocks)
richText.Blocks.Add(b);
}
private static List<Block> GenerateBlocksForHtml(string xhtml)
{
var blocks = new List<Block>();
try
{
var doc = new HtmlDocument();
doc.LoadHtml(xhtml);
var block = GenerateParagraph(doc.DocumentNode);
blocks.Add(block);
}
catch (Exception ex)
{
Debug.WriteLine(ex.Message);
}
return blocks;
}
// TODO this method seams to be removing necessary spaces in #text nodes
private static string CleanText(string input)
{
var clean = Windows.Data.Html.HtmlUtilities.ConvertToText(input);
//clean = System.Net.WebUtility.HtmlEncode(clean);
if (clean == "[=11=]")
clean = "\n";
return clean;
}
private static Block GenerateBlockForTopNode(HtmlNode node)
=> GenerateParagraph(node);
private static void AddChildren(Paragraph p, HtmlNode node)
{
var added = false;
foreach (var child in node.ChildNodes)
{
var i = GenerateBlockForNode(child);
if (i != null)
{
p.Inlines.Add(i);
added = true;
}
}
if (!added)
{
p.Inlines.Add(new Run { Text = CleanText(node.InnerText) });
}
}
private static void AddChildren(Span s, HtmlNode node)
{
var added = false;
foreach (var child in node.ChildNodes)
{
var i = GenerateBlockForNode(child);
if (i != null)
{
s.Inlines.Add(i);
added = true;
}
}
if (!added)
{
s.Inlines.Add(new Run { Text = CleanText(node.InnerText) });
}
}
private static Inline GenerateBlockForNode(HtmlNode node)
{
switch (node.Name)
{
case "b":
case "B":
case "strong":
case "STRONG":
return GenerateBold(node);
case "i":
case "I":
case "em":
case "EM":
return GenerateItalic(node);
case "u":
case "U":
return GenerateUnderline(node);
case "br":
case "BR":
return new LineBreak();
default:
return GenerateSpanWNewLine(node);
}
}
private static Inline GenerateBold(HtmlNode node)
{
var bold = new Bold();
AddChildren(bold, node);
return bold;
}
private static Inline GenerateUnderline(HtmlNode node)
{
var underline = new Underline();
AddChildren(underline, node);
return underline;
}
private static Inline GenerateItalic(HtmlNode node)
{
var italic = new Italic();
AddChildren(italic, node);
return italic;
}
private static Block GenerateParagraph(HtmlNode node)
{
var paragraph = new Paragraph();
AddChildren(paragraph, node);
return paragraph;
}
private static Inline GenerateSpanWNewLine(HtmlNode node)
{
var span = new Span();
AddChildren(span, node);
if (span.Inlines.Count > 0)
span.Inlines.Add(new LineBreak());
return span;
}
}
}
这是我在xaml文件中写的
<Page
x:Class="SampleHtml.MainPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:converter="using XAMLHtml"
xmlns:html="using HTMLPage1"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"
Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="*"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<RichTextBlock converter:Properties.Html="{Binding HTMLPage1}" Grid.Row="0"/>
</Grid>
这是 html 文件中的代码
<!DOCTYPE html>
<html lang="en" xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta charset="utf-8" />
<title></title>
</head>
<body>
<p><b>This text is bold</b></p>
<p><i>This text is italic</i></p>
<p>This is<sub> subscript</sub> and <sup>superscript</sup></p>
</body>
</html>
如果有人可以帮助我,我会 appreciate.Thank 你
此项目是 class UWP 平台的库。请下载完整项目并参考。
我检查了 class 名称的代码是 HtmlProperties
但不是 Properties
,因此您需要像下面这样编辑 xaml 代码
<RichTextBlock converter:HtmlProperties.Html="{x:Bind HtmlString}" />
一般我们可以使用WebViewBrush
获取webview内容然后设置为Rectangle控件。有关更多信息,请参阅此 document.
我想在 UWP 中将 HTML 转换为 RichTextBlock。我在 Whosebug 中找到了一些答案尝试了以下 link
中的代码但是,当我尝试在 richtextblock 控件中绑定 html 属性 时,它给出了错误提示,命名空间 "using XAMLHtml"[=15= 中不存在名称 "Properties" ]
我在 XAMLHtml.cs 文件
中加入了以下代码以将 HTML 转换为 RTFclass XAMLHtml
{
public class HtmlProperties : DependencyObject
{
public static readonly DependencyProperty HtmlProperty =
DependencyProperty.RegisterAttached(
"Html",
typeof(string),
typeof(HtmlProperties),
new PropertyMetadata(null, HtmlChanged));
private static RichTextBlock _currentObject;
private static void HtmlChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
var richText = d as RichTextBlock;
if (richText == null) return;
_currentObject = richText;
//Generate blocks
var xhtml = e.NewValue as string;
var blocks = GenerateBlocksForHtml(xhtml);
_currentObject = null;
//Add the blocks to the RichTextBlock
richText.Blocks.Clear();
foreach (var b in blocks)
richText.Blocks.Add(b);
}
private static List<Block> GenerateBlocksForHtml(string xhtml)
{
var blocks = new List<Block>();
try
{
var doc = new HtmlDocument();
doc.LoadHtml(xhtml);
var block = GenerateParagraph(doc.DocumentNode);
blocks.Add(block);
}
catch (Exception ex)
{
Debug.WriteLine(ex.Message);
}
return blocks;
}
// TODO this method seams to be removing necessary spaces in #text nodes
private static string CleanText(string input)
{
var clean = Windows.Data.Html.HtmlUtilities.ConvertToText(input);
//clean = System.Net.WebUtility.HtmlEncode(clean);
if (clean == "[=11=]")
clean = "\n";
return clean;
}
private static Block GenerateBlockForTopNode(HtmlNode node)
=> GenerateParagraph(node);
private static void AddChildren(Paragraph p, HtmlNode node)
{
var added = false;
foreach (var child in node.ChildNodes)
{
var i = GenerateBlockForNode(child);
if (i != null)
{
p.Inlines.Add(i);
added = true;
}
}
if (!added)
{
p.Inlines.Add(new Run { Text = CleanText(node.InnerText) });
}
}
private static void AddChildren(Span s, HtmlNode node)
{
var added = false;
foreach (var child in node.ChildNodes)
{
var i = GenerateBlockForNode(child);
if (i != null)
{
s.Inlines.Add(i);
added = true;
}
}
if (!added)
{
s.Inlines.Add(new Run { Text = CleanText(node.InnerText) });
}
}
private static Inline GenerateBlockForNode(HtmlNode node)
{
switch (node.Name)
{
case "b":
case "B":
case "strong":
case "STRONG":
return GenerateBold(node);
case "i":
case "I":
case "em":
case "EM":
return GenerateItalic(node);
case "u":
case "U":
return GenerateUnderline(node);
case "br":
case "BR":
return new LineBreak();
default:
return GenerateSpanWNewLine(node);
}
}
private static Inline GenerateBold(HtmlNode node)
{
var bold = new Bold();
AddChildren(bold, node);
return bold;
}
private static Inline GenerateUnderline(HtmlNode node)
{
var underline = new Underline();
AddChildren(underline, node);
return underline;
}
private static Inline GenerateItalic(HtmlNode node)
{
var italic = new Italic();
AddChildren(italic, node);
return italic;
}
private static Block GenerateParagraph(HtmlNode node)
{
var paragraph = new Paragraph();
AddChildren(paragraph, node);
return paragraph;
}
private static Inline GenerateSpanWNewLine(HtmlNode node)
{
var span = new Span();
AddChildren(span, node);
if (span.Inlines.Count > 0)
span.Inlines.Add(new LineBreak());
return span;
}
}
}
这是我在xaml文件中写的
<Page
x:Class="SampleHtml.MainPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:converter="using XAMLHtml"
xmlns:html="using HTMLPage1"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"
Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="*"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<RichTextBlock converter:Properties.Html="{Binding HTMLPage1}" Grid.Row="0"/>
</Grid>
这是 html 文件中的代码
<!DOCTYPE html>
<html lang="en" xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta charset="utf-8" />
<title></title>
</head>
<body>
<p><b>This text is bold</b></p>
<p><i>This text is italic</i></p>
<p>This is<sub> subscript</sub> and <sup>superscript</sup></p>
</body>
</html>
如果有人可以帮助我,我会 appreciate.Thank 你
此项目是 class UWP 平台的库。请下载完整项目并参考。
我检查了 class 名称的代码是 HtmlProperties
但不是 Properties
,因此您需要像下面这样编辑 xaml 代码
<RichTextBlock converter:HtmlProperties.Html="{x:Bind HtmlString}" />
一般我们可以使用WebViewBrush
获取webview内容然后设置为Rectangle控件。有关更多信息,请参阅此 document.