Version 9.0.4

Compare
Released on May 6, 2026, WinHTMLEditorControl 9.0.4 adds Word/Outlook paste auto-detect with image auto-resize, improves alignment and table editing, and fixes WinForms crashes/perf issues plus many silent exception swallows.
Implemented Features
  • Support Hyperlink to Bookmark
  • When user mouse over a link, a pop up should show CTRL+ Click to view the page.
  • Need an option to choose the default font size unit from 'px' or 'pt'
  • Align Left, Align Centre, and Align Right can only be used for entire page, this behavior needs to be changed so that single line can be aligned.
  • Cannot set backgorund color of a table cell
  • Need to use style attribute for images.
  • Opening a existing HTML page for editing programmatically
  • Option to add "?rel=0" in youtube video-url
  • Disable default opening of window on clicking ctrl+click on winhtmleditor control
  • Raise an Event with the Full Path of the File which is just opened by the OPEN button.
  • Use Nuget Package for the component delivery.
  • Multi-target .NET Framework 4.7.2 and 4.8 in addition to net45 and .NET 5-10
  • Distribute the control as a NuGet package
  • License-key activation system replacing license file
  • Embedded spell-check dictionaries (zero-config)
  • Read-only / preview mode hyperlinks open in default browser instead of Internet Explorer (Feature 1.1)
  • Modern Formatted HTML Source View (Feature 2.2)
  • Intelligent 2-Way Table Dialog (Feature 2.3)
  • Modern DPI-aware PNG icon set with per-monitor scaling (WinForms portion of Feature 2.4)
  • View Source command in the right-click context menu (Feature 2.5.1)
  • HTML5 DOCTYPE by default with override controls (Feature 2.5.2)
  • Auto-detect MS Word and Outlook clipboard content on Paste (Feature 2.5.3)
  • Auto-resize pasted or inserted images larger than 720 pixels (Feature 2.5.4)
  • Mail-merge placeholder insertion API and opt-in toolbar (Feature 2.5.5)
  • Centralized localization with EditorLanguage / SpellCheckLanguage and 12+ language packs (Feature 3.4)
  • It would be nice to get formatted HTML from the editor.
  • Optimize the output HTML
  • Update the Hunspell library.
  • How to Remember the editor's vertical scroll position?
  • Symbol picker: categorized navigation, search, and expanded glyph catalog
Resolved Bugs
  • If you change the value of HeaderStyleContentElementID property, then, the control will insert another style block with the new ID and leave an old Style Block with previous ID.
  • Tab "Edges" in "BodyStyle" window does not show updated margin (shows old values) if margin has short format (not margin-top, margin-bottom, etc)
  • Inserted Carriage Return Issue
  • Header type cannot be changed to 'No Heading', if cursor is on empty next line before the header
  • Table property settings not available after copying a table from MS Word
  • If a word is spelled incorrectly and there is a number present in the word that word will not be underlined by the inline spell checker.
  • Event HTMLChanged is not fired when text-alignment is changed
  • Adding the 4.0 .dll to the toolbox on a 4.0 project succeeds but are not enabled in the active designer, it says to make sure
  • Read-only mode opens hyperlinks in Internet Explorer instead of the system default browser
  • Dead recursive call in FontLogic.GetFontNameFromHtmlElement wastes CPU when face attribute is null
  • Missing try/finally around FontSizeSelectionUpdating leaves the WinForms font-size combo permanently disabled after a COM exception
  • GetActiveForeColor and GetActiveHighlightColor return transparent black when an exception occurs, glitching the toolbar swatch
  • About 25 silent catch blocks in StateQueryService swallow exceptions and make failures impossible to diagnose
  • Silent exception swallow in HtmlFormatter.Format hides failures
  • Silent exception swallow in FilterMSWordHtmlHelper.LegacyCleanOfficeHtml hides failures
  • Six silent catches in ContentService swallow GetBodyText, GetFormattedPlainText, GetBodyStyle, GetBrowserBodyStyle, GetRightToLeft, SetRightToLeft failures
  • Table dialog CellPadding and CellSpacing fields are blank for tables styled via stylesheet rules
  • Clicking the Table toolbar button while the caret is inside a TD inserts a new table inside the cell instead of opening the dialog in EDIT mode for the existing table
  • IsMarkedAsZeroBorderTable returns true on phantom values because getAttribute is called without lFlags=2 on WinForms MSHTML
  • element as IHTMLTable silently returns null through the WinForms RCW boundary, breaking getZeroBorderTableType
  • tableElement.border "as string" drops boxed-int values causing numeric border attributes to be ignored
  • ShowGuidelinesForTablesWithZeroBorder(bool) silently ignores its parameter
  • HideGuidelineForZeroBorderTable has no synchronous overload, forcing callers to race the worker
  • applyZeroBorderStyleDirect unconditionally uses _ihtmDocument and throws NullReferenceException on WinForms
  • WinForms FirePastingEvent throws ClassCastException when any Pasting handler is attached
  • Five silent catch blocks in WinForms ProductService swallow license / persistence failures
  • Word and Outlook HTML clipboard content was not auto-detected on Paste, forcing the user to know about and use the [W] toolbar button
  • Read-only mode opens hyperlinks in Internet Explorer instead of the system default browser
  • Dead recursive call in FontLogic.GetFontNameFromHtmlElement wastes CPU when face attribute is null
  • Missing try/finally around FontSizeSelectionUpdating leaves the WinForms font-size combo permanently disabled after a COM exception
  • GetActiveForeColor and GetActiveHighlightColor return transparent black when an exception occurs, glitching the toolbar swatch
  • About 25 silent catch blocks in StateQueryService swallow exceptions and make failures impossible to diagnose
  • Silent exception swallow in HtmlFormatter.Format hides failures
  • Silent exception swallow in FilterMSWordHtmlHelper.LegacyCleanOfficeHtml hides failures
  • Six silent catches in ContentService swallow GetBodyText, GetFormattedPlainText, GetBodyStyle, GetBrowserBodyStyle, GetRightToLeft, SetRightToLeft failures
  • Table dialog CellPadding and CellSpacing fields are blank for tables styled via stylesheet rules
  • Clicking the Table toolbar button while the caret is inside a TD inserts a new table inside the cell instead of opening the dialog in EDIT mode for the existing table
  • IsMarkedAsZeroBorderTable returns true on phantom values because getAttribute is called without lFlags=2 on WinForms MSHTML
  • element as IHTMLTable silently returns null through the WinForms RCW boundary, breaking getZeroBorderTableType
  • tableElement.border "as string" drops boxed-int values causing numeric border attributes to be ignored
  • ShowGuidelinesForTablesWithZeroBorder(bool) silently ignores its parameter
  • HideGuidelineForZeroBorderTable has no synchronous overload, forcing callers to race the worker
  • applyZeroBorderStyleDirect unconditionally uses _ihtmDocument and throws NullReferenceException on WinForms
  • WinForms FirePastingEvent throws ClassCastException when any Pasting handler is attached
  • Five silent catch blocks in WinForms ProductService swallow license / persistence failures
  • Word and Outlook HTML clipboard content was not auto-detected on Paste, forcing the user to know about and use the [W] toolbar button
  • Alignment logic does not work if content is selected
  • Font-(ComboBox)-Bug
  • Pasting from Word
  • Img paths when InsertHtml() and BaseUrl
  • Conditional comments are not correctly parsed
  • Overriding editor controls keybinding shortcuts
  • FireInlineSpellCheckingOnKeyStroke slows the editor down
Changed Interfaces
  • Assembly and root namespace renamed (WinForms): the legacy WinForms editor lived in assembly WinFormHtmlEditor.dll with root namespace SpiceLogic.WinHTMLEditor.WinForm. The modernized control lives in assembly SpiceLogic.HtmlEditor.WinForms.dll with namespace SpiceLogic.HtmlEditor.WinForms. Replace every "using SpiceLogic.WinHTMLEditor.WinForm;" with "using SpiceLogic.HtmlEditor.WinForms;" and update assembly references / project references accordingly. The control class name WinFormHtmlEditor is preserved, so only the namespace changes.
  • Distribution model changed from single DLL to NuGet packages. The legacy editors were distributed as standalone DLLs (WinFormHtmlEditor.dll and SpiceLogicWPFHtmlEditor.dll) that customers manually referenced. The modernized controls are distributed as NuGet packages SpiceLogic.HtmlEditor.WinForms and SpiceLogic.HtmlEditor.WPF. Customers should remove direct DLL references and add the NuGet package via Install-Package SpiceLogic.HtmlEditor.WinForms or Install-Package SpiceLogic.HtmlEditor.WPF. Inner libraries (Core, Infrastructure, Abstractions, Resources, Services) are private dependencies and do not need to be referenced separately.
  • Target framework switched from a single .NET Framework target to multi-targeting. The legacy WinForms control targeted .NET Framework 2.0 only. The modernized package multi-targets net45;net472;net48;net5.0-windows;net6.0-windows;net7.0-windows;net8.0-windows;net9.0-windows;net10.0-windows. Customers can use the same package on any of these. Existing .NET 2.0 consumers must upgrade their project to at least net45.
  • License key is now set via a static LicenseKey property on the editor control. Set this once at application startup BEFORE constructing any editor instance. Example for WinForms in Program.cs: WinFormHtmlEditor.LicenseKey = "your-license-key-here";. Without a valid key the control runs in trial mode and shows a "Trial Expired" body once the trial elapses. The legacy controls had no per-app license key API; activation was hard-coded into the assembly or relied on file-based / hardware-bound activation tied to the developer's machine.
  • EditorModes enum values renamed to PascalCase. Replace EditorModes.WYSIWYG_Design with EditorModes.WysiwygDesign, EditorModes.HTML_Edit with EditorModes.HtmlEdit, and EditorModes.ReadOnly_Preview with EditorModes.ReadOnlyPreview. The enum itself moved from the legacy SpiceLogic.HtmlEditorControl.Domain.BOs namespace to SpiceLogic.HtmlEditor.Abstractions. Add "using SpiceLogic.HtmlEditor.Abstractions;" to consuming code.
  • Toolbar button accessor BtnPasteFromMSWord renamed to BtnPasteFromMsWord. Replace editor.BtnPasteFromMSWord with editor.BtnPasteFromMsWord. Field name, behaviour, and icon are unchanged. Note: the underlying private field _factoryBtnPasteFromMSWord keeps the legacy spelling for binary compatibility but is internal.
  • Service interfaces moved to SpiceLogic.HtmlEditor.Abstractions. The service interfaces exposed by the editor (IStateQueryService, IContentService, ICaretService, IEditorService, IFormattingService, ISelectionService, IDialogService) were moved from the legacy SpiceLogic.HtmlEditorControl.Domain.Services namespace to SpiceLogic.HtmlEditor.Abstractions.Services. Code that holds references to editor.Content, editor.Caret, etc. must update its using directives. The property surface and method signatures are largely preserved.
  • EventArgs classes moved to new namespaces. Types such as ContextMenuShowingEventArgs, StatusChangedEventArgs, HtmlElementClickedEventArgs, EditorMouseEventArgs, EditorKeyEventArgs, PastingHtmlEventArgs, SpellCheckCompletedEventArgs, ErrorEventArgs, EditorPreProcessMessageEventArgs moved from SpiceLogic.HtmlEditorControl.Domain.BOs.EditorEventArgs to SpiceLogic.HtmlEditor.Abstractions.EditorEventArgs (shared) plus product-specific SpiceLogic.HtmlEditor.WinForms.Models.BOs.EditorEventArgs. Update event handler using directives accordingly.
  • UserOption and SpellCheckerOption namespaces relocated. UserOption (used by editor.Options) moved from legacy SpiceLogic.HtmlEditorControl.Domain.BOs.UserOptions to SpiceLogic.HtmlEditor.WinForms.Models.BOs.UserOptions. Shared SpellCheckerOption moved to SpiceLogic.HtmlEditor.Core.SpellCheck. Code that constructs new UserOption() or new SpellCheckerOption() only needs using-directive updates.
  • WinForms _cleaner field renamed to Cleaner. The legacy WinForms control exposed an HtmlCleaner instance via the public field _cleaner. In the modernized control this field is renamed to Cleaner (PascalCase, still public readonly) and the [CLSCompliant(false)] attribute was removed. Replace editor._cleaner.SomeMethod() with editor.Cleaner.SomeMethod().
  • New Language localization property added. The modernized controls expose a new Language property of type EditorLanguage (in SpiceLogic.HtmlEditor.Abstractions) that localizes all toolbar tooltips, dialog labels, context menu items, and messages at runtime. Defaults to EditorLanguage.EnglishUs. Setting Language also auto-syncs the spell checker language when SpellCheckOptions.SpellCheckLanguage = SpellCheckLanguage.SameAsEditorLanguage (the default). The legacy controls had no such API.
  • New ShowPlaceholderToolbar mail-merge API. A new opt-in mail-merge toolbar was added: ShowPlaceholderToolbar (bool, default false) and the read-only PlaceholderToolbar accessor. When set to true, a third toolbar row appears with a field-picker dropdown plus an Insert button backed by editor.Content.MailMerge.PlaceholderFields. The legacy controls had no mail-merge feature. Existing customer code is unaffected unless they choose to enable the feature.
  • Removed IsFtpUploaderBusy property and FTPUpload_Completed event. The legacy controls exposed bool IsFtpUploaderBusy and event EventHandler<EventArgs> FTPUpload_Completed (WinForms) / RoutedEvent FTPUpload_CompletedEvent (WPF), surfacing the built-in FTP image-upload feature. These have been removed. Customers who relied on the FTP-upload-completed signal must migrate to handling image insertion via the Pasting event or Content service hooks.
  • Removed BodyStyleChangedUsingStyleEditorDialog event. The legacy WinForms control exposed event EventHandler<EventArgs> BodyStyleChangedUsingStyleEditorDialog, fired when the user clicked OK on the Body Style Builder dialog. This event was removed. Customers who want to react to body-style changes should subscribe to HtmlChanged and inspect the BodyStyle property, or handle it through the dialog-service customization hook.
  • ToolbarItemOverrideHelper namespace changed. The ToolbarItemOverrider property still returns a ToolbarItemOverrideHelper for hooking into factory toolbar item click events, but the type moved from SpiceLogic.WinHTMLEditor.WinForm.ToolbarModule to SpiceLogic.HtmlEditor.WinForms.ToolbarModule. Code that calls editor.ToolbarItemOverrider.OnNewButtonClicked += handler; will compile as soon as the new using is added.
  • IDialogService interface moved and decomposed. The legacy IDialogService (used via editor.Dialog) lived in SpiceLogic.HtmlEditorControl.Domain.Services. It now lives in SpiceLogic.HtmlEditor.WinForms.Models.Services with a shared base in IDialogServiceBase. Custom dialog implementations injected via editor.Dialog = myCustomService; must be updated to implement the new interface from the new namespace.
  • Designer attribute renamed from HTMLEditorDesigner to HtmlEditorDesigner. The class-level [Designer(typeof(HTMLEditorDesigner))] attribute on WinFormHtmlEditor was renamed to [Designer(typeof(HtmlEditorDesigner))] (PascalCase). The designer assembly is now packaged in the NuGet tools/ folder rather than co-located with the control DLL. Affects only customers who reference the designer type directly or build custom designer skins.
  • ImageResizer.ClampImageWidths is a new public utility in Core. Pure regex-based width clamper called by the clipboard paste pipeline and by the image-dialog OK paths to enforce Options.MaxPastedImageWidth.
  • TableElement getters now read CSS computed style as fallback. Behaviour change: previously returned blank when only stylesheet rules set padding / spacing; now returns the effective value via IHTMLElement2.currentStyle / inline border-spacing. Customers parsing dialog values may see new non-blank values for stylesheet-styled tables. Setter-side round-trip limitation documented on the class.
  • Several legacy public members marked [CLSCompliant(false)] due to mshtml COM types — GetMshtmlDoc2(), BodyStyleAsDOM, StateQuery, Content, Selection, Dialog — no longer carry that attribute in the modernized controls because the unified package references Unofficial.Microsoft.mshtml.NetStandard on all frameworks. CLS-compliant consumers (VB.NET / F#) can now use these members without warnings. Signatures and behaviour are unchanged.
  • WinForms EditorMembers field is now internal (was _editorMembers). The legacy WinForms control had a "private readonly EditorLimitedMembers _editorMembers" field; the modernized control declares "internal readonly EditorLimitedMembers EditorMembers" (still inaccessible to external assemblies). No customer-visible impact unless they used reflection on the field name.