这是一个完全由托管代码编写的库,能够绘制出格式优美的HTML。它附带了三个WinForms控件:
以及一个静态方法,用于绘制HTML:
C# HtmlRenderer.Render(Graphics g, string html, RectangleF area, bool clip)
注意:渲染引擎基于CSSLevel 2规范。
多年来,一直在计划这样一个项目。为此做了充分的准备。通读了CSS Level 2规范和HTML 4.01规范。
发现最有趣的一点是:绘制HTML不过是布局一堆带有边框、边距和内边距的盒子。一旦超越了这个范式,其他一切都是帮助代码将盒子放置在正确的位置,然后绘制每个盒子包含的字符串。
想象一下,在桌面应用程序中,绘制全富格式化的HTML可以为应用带来多大的力量。在需要时使用粗体,每条消息都使用斜体,以及在桌面应用程序的任何地方使用喜欢或需要的边框和字体。将首先在Ribbon项目中使用它。
尽管还没有在Mono上测试过,但应该不会有任何问题,因为库中的所有代码都是托管代码,它用于绘制的方法非常基础。它绘制线条、矩形、曲线和文本。
目前,渲染效果非常好。有时它可以让误以为正在使用一个真正的Web浏览器,相信,下载演示,它只是一个EXE和一个DLL。
该库将代码定位在System.Drawing.Html命名空间下。渲染HTML的控件位于System.Windows.Forms命名空间下。
渲染器遵循CSS盒模型。盒模型不过是一堆盒子的树,就像HTML的树一样,每个盒子都由一个非常常用的类表示,称为CssBox。起始节点由类InitialContainer表示。
所有已知的CSS属性都适用于这些盒子。每个盒子可以包含任意数量的子盒子,只有一个父盒子。唯一一个没有父盒子的盒子就是所谓的初始容器。
使用初始容器绘制HTML的典型用法如下:
C# //
创建初始容器
InitialContainer c = new InitialContainer("");
//
给容器设置边界
c.SetBounds(ClientRectangle);
//
测量树上每个盒子的边界
c.MeasureBounds(graphics);
//
绘制HTML文档
c.Paint(graphics);
首先是标签,然后是面板,最后是工具提示,它们都支持HTML渲染。
可能永远不需要使用它,因为提供了控件和方法来为创建这个对象。
一个面板,通过其Text属性准备好接受HTML代码。它的全名是System.Windows.Forms.HtmlPanel。
只需要知道以下属性:
面板会在滚动或调整控件大小时更新元素的边界。
一个标签,通过其Text属性准备好接受HTML代码。它的全名是System.Windows.Forms.HtmlLabel。
只需要知道以下属性:
一些有趣的事情:
与已经知道的ToolTip完全一样,只是这个ToolTip会渲染HTML。它的全名是System.Windows.Forms.HtmlToolTip。
这里没有要学习的属性。就像使用框架中附带的ToolTip一样使用它。在内部,它只是处理OwnerDraw事件。
擅自添加了一些功能:
这些是通过以下CSS属性实现的:
background-gradient: (color)
background-gradient-angle: (number)
corner-ne-radius: (length)
corner-nw-radius: (length)
corner-se-radius: (length)
corner-se-radius: (length)
corner-radius: (length){1,4} (所有角落的简写)
大多数边框、内边距、外边距和定位CSS属性(除了height属性)
水平和垂直文本对齐,文本缩进
列表,有序和无序。高级编号尚未支持
表格,几乎所有的。单元格组合在测试过的范围内工作得很好
字体(部分)和颜色
背景(仅颜色)
能说什么,这是参与过的最有趣的项目之一。到目前为止,它运行得非常好,并且符合最初的设计目标。
计划给它完整的渲染支持,直到可以像一个好的Web浏览器一样可视化一个网页;为什么不,制作一个所见即所得的HTML编辑器,为应用程序提供惊人的HTML编辑能力。
还计划确保它在Mono和移动平台上运行得非常好。
在接下来的几天里,将发布一个支持的HTML标签和CSS属性的列表。