Class HtmlRender
- Namespace
- TheArtOfDev.HtmlRenderer.WPF
- Assembly
- StockSharp.Xaml.dll
Standalone static class for simple and direct HTML rendering.
For WPF UI prefer using HTML controls: HtmlPanel or HtmlLabel.
For low-level control and performance consider using HtmlContainer.
public static class HtmlRender
- Inheritance
-
HtmlRender
- Inherited Members
Examples
Simple rendering
HtmlRender.Render(g, "<div>Hello <b>World</b></div>");
HtmlRender.Render(g, "<div>Hello <b>World</b></div>", 10, 10, 500, CssData.Parse("body {font-size: 20px}")");
Image rendering
HtmlRender.RenderToImage("<div>Hello <b>World</b></div>", new Size(600,400));
HtmlRender.RenderToImage("<div>Hello <b>World</b></div>", 600);
HtmlRender.RenderToImage(existingImage, "<div>Hello <b>World</b></div>");
Remarks
Rendering to image
// TODO:a update!
See https://htmlrenderer.codeplex.com/wikipage?title=Image%20generation
Because of GDI text rendering issue with alpha channel clear type text rendering rendering to image requires special handling.
Solid color background - generate an image where the background is filled with solid color and all the html is rendered on top
of the background color, GDI text rendering will be used. (RenderToImage method where the first argument is html string)
Image background - render html on top of existing image with whatever currently exist but it cannot have transparent pixels,
GDI text rendering will be used. (RenderToImage method where the first argument is Image object)
Transparent background - render html to empty image using GDI+ text rendering, the generated image can be transparent.
Overwrite stylesheet resolution
Exposed by optional "stylesheetLoad" delegate argument.
Invoked when a stylesheet is about to be loaded by file path or URL in 'link' element.
Allows to overwrite the loaded stylesheet by providing the stylesheet data manually, or different source (file or URL) to load from.
Example: The stylesheet 'href' can be non-valid URI string that is interpreted in the overwrite delegate by custom logic to pre-loaded stylesheet object
If no alternative data is provided the original source will be used.
Overwrite image resolution
Exposed by optional "imageLoad" delegate argument.
Invoked when an image is about to be loaded by file path, URL or inline data in 'img' element or background-image CSS style.
Allows to overwrite the loaded image by providing the image object manually, or different source (file or URL) to load from.
Example: image 'src' can be non-valid string that is interpreted in the overwrite delegate by custom logic to resource image object
Example: image 'src' in the html is relative - the overwrite intercepts the load and provide full source URL to load the image from
Example: image download requires authentication - the overwrite intercepts the load, downloads the image to disk using custom code and provide
file path to load the image from.
If no alternative data is provided the original source will be used.
Note: Cannot use asynchronous scheme overwrite scheme.
Methods
AddFontFamily(FontFamily)
Adds a font family to be used in html rendering.
The added font will be used by all rendering function including HtmlContainer and all WPF controls.
public static void AddFontFamily(FontFamily fontFamily)
Parameters
fontFamily
FontFamilyThe font family to add.
Remarks
The given font family instance must be remain alive while the renderer is in use.
If loaded from file then the file must not be deleted.
AddFontFamilyMapping(string, string)
Adds a font mapping from fromFamily
to toFamily
iff the fromFamily
is not found.
When the fromFamily
font is used in rendered html and is not found in existing
fonts (installed or added) it will be replaced by toFamily
.
public static void AddFontFamilyMapping(string fromFamily, string toFamily)
Parameters
Remarks
This fonts mapping can be used as a fallback in case the requested font is not installed in the client system.
Measure(string, double, CssData, EventHandler<HtmlStylesheetLoadEventArgs>, EventHandler<HtmlImageLoadEventArgs>)
Measure the size (width and height) required to draw the given html under given max width restriction.
If no max width restriction is given the layout will use the maximum possible width required by the content,
it can be the longest text line or full image width.
public static Size Measure(string html, double maxWidth = 0, CssData cssData = null, EventHandler<HtmlStylesheetLoadEventArgs> stylesheetLoad = null, EventHandler<HtmlImageLoadEventArgs> imageLoad = null)
Parameters
html
stringHTML source to render
maxWidth
doubleoptional: bound the width of the html to render in (default - 0, unlimited)
cssData
CssDataoptional: the style to use for html rendering (default - use W3 default style)
stylesheetLoad
EventHandler<HtmlStylesheetLoadEventArgs>optional: can be used to overwrite stylesheet resolution logic
imageLoad
EventHandler<HtmlImageLoadEventArgs>optional: can be used to overwrite image resolution logic
Returns
- Size
the size required for the html
ParseStyleSheet(string, bool)
Parse the given stylesheet to CssData object.
If combineWithDefault
is true the parsed css blocks are added to the
default css data (as defined by W3), merged if class name already exists. If false only the data in the given stylesheet is returned.
public static CssData ParseStyleSheet(string stylesheet, bool combineWithDefault = true)
Parameters
stylesheet
stringthe stylesheet source to parse
combineWithDefault
booltrue - combine the parsed css data with default css data, false - return only the parsed css data
Returns
- CssData
the parsed css data
Render(DrawingContext, string, double, double, double, CssData, EventHandler<HtmlStylesheetLoadEventArgs>, EventHandler<HtmlImageLoadEventArgs>)
Renders the specified HTML source on the specified location and max width restriction.
If maxWidth
is zero the html will use all the required width, otherwise it will perform line
wrap as specified in the html
Returned is the actual width and height of the rendered html.
public static Size Render(DrawingContext g, string html, double left = 0, double top = 0, double maxWidth = 0, CssData cssData = null, EventHandler<HtmlStylesheetLoadEventArgs> stylesheetLoad = null, EventHandler<HtmlImageLoadEventArgs> imageLoad = null)
Parameters
g
DrawingContextDevice to render with
html
stringHTML source to render
left
doubleoptional: the left most location to start render the html at (default - 0)
top
doubleoptional: the top most location to start render the html at (default - 0)
maxWidth
doubleoptional: bound the width of the html to render in (default - 0, unlimited)
cssData
CssDataoptional: the style to use for html rendering (default - use W3 default style)
stylesheetLoad
EventHandler<HtmlStylesheetLoadEventArgs>optional: can be used to overwrite stylesheet resolution logic
imageLoad
EventHandler<HtmlImageLoadEventArgs>optional: can be used to overwrite image resolution logic
Returns
- Size
the actual size of the rendered html
Render(DrawingContext, string, Point, Size, CssData, EventHandler<HtmlStylesheetLoadEventArgs>, EventHandler<HtmlImageLoadEventArgs>)
Renders the specified HTML source on the specified location and max size restriction.
If maxSize
.Width is zero the html will use all the required width, otherwise it will perform line
wrap as specified in the html
If maxSize
.Height is zero the html will use all the required height, otherwise it will clip at the
given max height not rendering the html below it.
Returned is the actual width and height of the rendered html.
public static Size Render(DrawingContext g, string html, Point location, Size maxSize, CssData cssData = null, EventHandler<HtmlStylesheetLoadEventArgs> stylesheetLoad = null, EventHandler<HtmlImageLoadEventArgs> imageLoad = null)
Parameters
g
DrawingContextDevice to render with
html
stringHTML source to render
location
Pointthe top-left most location to start render the html at
maxSize
Sizethe max size of the rendered html (if height above zero it will be clipped)
cssData
CssDataoptional: the style to use for html rendering (default - use W3 default style)
stylesheetLoad
EventHandler<HtmlStylesheetLoadEventArgs>optional: can be used to overwrite stylesheet resolution logic
imageLoad
EventHandler<HtmlImageLoadEventArgs>optional: can be used to overwrite image resolution logic
Returns
- Size
the actual size of the rendered html
RenderToImage(string, int, int, Color, CssData, EventHandler<HtmlStylesheetLoadEventArgs>, EventHandler<HtmlImageLoadEventArgs>)
Renders the specified HTML into a new image of unknown size that will be determined by max width/height and HTML layout.
If maxWidth
is zero the html will use all the required width, otherwise it will perform line
wrap as specified in the html
If maxHeight
is zero the html will use all the required height, otherwise it will clip at the
given max height not rendering the html below it.
Limitation: The image cannot have transparent background, by default it will be white.
See "Rendering to image" remarks section on HtmlRender.
public static BitmapFrame RenderToImage(string html, int maxWidth = 0, int maxHeight = 0, Color backgroundColor = default, CssData cssData = null, EventHandler<HtmlStylesheetLoadEventArgs> stylesheetLoad = null, EventHandler<HtmlImageLoadEventArgs> imageLoad = null)
Parameters
html
stringHTML source to render
maxWidth
intoptional: the max width of the rendered html, if not zero and html cannot be layout within the limit it will be clipped
maxHeight
intoptional: the max height of the rendered html, if not zero and html cannot be layout within the limit it will be clipped
backgroundColor
Coloroptional: the color to fill the image with (default - white)
cssData
CssDataoptional: the style to use for html rendering (default - use W3 default style)
stylesheetLoad
EventHandler<HtmlStylesheetLoadEventArgs>optional: can be used to overwrite stylesheet resolution logic
imageLoad
EventHandler<HtmlImageLoadEventArgs>optional: can be used to overwrite image resolution logic
Returns
- BitmapFrame
the generated image of the html
RenderToImage(string, Size, Size, Color, CssData, EventHandler<HtmlStylesheetLoadEventArgs>, EventHandler<HtmlImageLoadEventArgs>)
Renders the specified HTML into a new image of unknown size that will be determined by min/max width/height and HTML layout.
If maxSize.Width.Width
is zero the html will use all the required width, otherwise it will perform line
wrap as specified in the html
If maxSize.Height.Height
is zero the html will use all the required height, otherwise it will clip at the
given max height not rendering the html below it.
If minSize
(Width/Height) is above zero the rendered image will not be smaller than the given min size.
Limitation: The image cannot have transparent background, by default it will be white.
See "Rendering to image" remarks section on HtmlRender.
public static BitmapFrame RenderToImage(string html, Size minSize, Size maxSize, Color backgroundColor = default, CssData cssData = null, EventHandler<HtmlStylesheetLoadEventArgs> stylesheetLoad = null, EventHandler<HtmlImageLoadEventArgs> imageLoad = null)
Parameters
html
stringHTML source to render
minSize
Sizeoptional: the min size of the rendered html (zero - not limit the width/height)
maxSize
Sizeoptional: the max size of the rendered html, if not zero and html cannot be layout within the limit it will be clipped (zero - not limit the width/height)
backgroundColor
Coloroptional: the color to fill the image with (default - white)
cssData
CssDataoptional: the style to use for html rendering (default - use W3 default style)
stylesheetLoad
EventHandler<HtmlStylesheetLoadEventArgs>optional: can be used to overwrite stylesheet resolution logic
imageLoad
EventHandler<HtmlImageLoadEventArgs>optional: can be used to overwrite image resolution logic
Returns
- BitmapFrame
the generated image of the html
RenderToImage(string, Size, CssData, EventHandler<HtmlStylesheetLoadEventArgs>, EventHandler<HtmlImageLoadEventArgs>)
Renders the specified HTML into a new image of the requested size.
The HTML will be layout by the given size but will be clipped if cannot fit.
public static BitmapFrame RenderToImage(string html, Size size, CssData cssData = null, EventHandler<HtmlStylesheetLoadEventArgs> stylesheetLoad = null, EventHandler<HtmlImageLoadEventArgs> imageLoad = null)
Parameters
html
stringHTML source to render
size
SizeThe size of the image to render into, layout html by width and clipped by height
cssData
CssDataoptional: the style to use for html rendering (default - use W3 default style)
stylesheetLoad
EventHandler<HtmlStylesheetLoadEventArgs>optional: can be used to overwrite stylesheet resolution logic
imageLoad
EventHandler<HtmlImageLoadEventArgs>optional: can be used to overwrite image resolution logic
Returns
- BitmapFrame
the generated image of the html