[英]How to convert HTML to RTF in UWP
I want to convert HTML to RichTextBlock in UWP.我想在 UWP 中将 HTML 转换为 RichTextBlock。 I found some answers in stackoverflow tried the code in following link
我在stackoverflow中找到了一些答案尝试了以下链接中的代码
But when I try to bind html property in richtextblock controls it gives error saying The name "Properties" does not exist in the namespace "using XAMLHtml"但是当我尝试在 Richtextblock 控件中绑定 html 属性时,它给出错误说名称“属性”在命名空间“使用 XAMLHtml”中不存在
I included following code to convert HTML to RTF in XAMLHtml.cs file我在 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 == "\0")
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;
}
}
}
here what I write in xaml file这是我在 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>
here is the code in html file这是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>
If anyone can help me with this I would appreciate.Thank you如果有人能帮我解决这个问题,我将不胜感激。谢谢
This project is class lib for UWP platform.该项目是 UWP 平台的类库。 please download the full project and refer it.
请下载完整的项目并参考。
I check the code the class name is HtmlProperties
but not Properties
, so you need edit your xaml code like the following我检查了类名是
HtmlProperties
但不是Properties
的代码,所以你需要像下面这样编辑你的 xaml 代码
<RichTextBlock converter:HtmlProperties.Html="{x:Bind HtmlString}" />
In general we could use WebViewBrush
to get the webview content then set it the Rectangle control.一般来说,我们可以使用
WebViewBrush
来获取 webview 内容,然后将其设置为 Rectangle 控件。 for more please refer this document .有关更多信息,请参阅此文档。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.