Version 3.0.12

Compare
Released on May 6, 2026, wpfHtmlEditor 3.0.12 fixes table editing (no nested tables, merge/selection works, dialog reads CSS), enables per-selection alignment and auto Word/Outlook paste handling, and improves spellcheck, stability, and diagnostics.
Implemented Features
  • It would be nice to get formatted HTML from the editor.
  • When user mouse over a link, a pop up should show CTRL+ Click to view the page. And Ctrl+Click should open the link.
  • Optimize the output HTML
  • Update the Hunspell library.
  • Use Nuget Package for the component delivery.
  • How to Remember the editor's vertical scroll position?
  • 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 hyperlink behaviour matched to WinForms (Feature 1.1)
  • Modern Formatted HTML Source View (Feature 2.2)
  • Intelligent 2-Way Table Dialog (Feature 2.3)
  • Modern XAML vector icon set, resolution-independent at any DPI (WPF 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)
  • 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
  • Opening a existing HTML page for editing programmatically
  • Disable default opening of window on clicking ctrl+click on winhtmleditor control
  • Option to add "?rel=0" in youtube video-url
  • Raise an Event with the Full Path of the File which is just opened by the OPEN button.
  • Need to use style attribute for images.
  • Support Hyperlink to Bookmark
  • Need an option to choose the default font size unit from 'px' or 'pt'
  • Symbol picker: categorized navigation, search, and expanded glyph catalog
Resolved Bugs
  • Alignment logic does not work if content is selected
  • Font-(ComboBox)-Bug
  • Conditional comments are not correctly parsed
  • Table Cell Merge does not work.
  • Pasting from Word
  • FireInlineSpellCheckingOnKeyStroke slows the editor down
  • Overriding editor controls keybinding shortcuts
  • Img paths when InsertHtml() and BaseUrl
  • Dead recursive call in FontLogic.GetFontNameFromHtmlElement wastes CPU when face attribute is null
  • Missing try/finally around FontSizeSelectionUpdating leaves the WPF font-size combo permanently disabled after a COM exception
  • NullReferenceException on font-size apply when WebBrowser is null on WPF
  • 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
  • ZeroBorderTableService WPF constructor accepts null editor or document and throws NRE on first use
  • Silent exception swallow in HtmlFormatter.Format hides failures
  • Silent exception swallow in FilterMSWordHtmlHelper.LegacyCleanOfficeHtml hides failures
  • WPF SpellCheckerService.CleanupCurrentMisspelledWordStyle is an empty no-op leaving misspelled-word styling stuck on the caret word
  • WPF SpellCheckerService.CleanUpInlineSpellCheckMarkers is an empty no-op leaving red squiggles permanently visible
  • WPF SpellCheckerService.CleanupSelectedMisspelledWordsStyles is an empty no-op leaving selection styling stuck
  • Six silent catches in ContentService swallow GetBodyText, GetFormattedPlainText, GetBodyStyle, GetBrowserBodyStyle, GetRightToLeft, SetRightToLeft failures
  • TableManipulator cell-merge drag-select silently broken on WPF because WPF was using the WinForms TableManipulator whose HtmlDocument event hooks no-op when IWebBrowser.Document is null
  • Virtual factory called from base constructor causes NullReferenceException on WPF TableAuthoringService
  • 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
  • ShowGuidelinesForTablesWithZeroBorder(bool) silently ignores its parameter
  • HideGuidelineForZeroBorderTable has no synchronous overload, forcing callers to race the worker
  • WPF CheckIfPastingEventHandlerAttachedMethod returns null causing NullReferenceException in ClipboardService.ObtainPastingHtml
  • WPF ProductService used path concatenation ("\\" + name) breaking cross-platform safety, plus camelCase methods, productFIleSettingsPath typo, and silent catches
  • Word and Outlook HTML clipboard content was not auto-detected on Paste, forcing the user to know about and use the [W] toolbar button
  • Dead recursive call in FontLogic.GetFontNameFromHtmlElement wastes CPU when face attribute is null
  • Missing try/finally around FontSizeSelectionUpdating leaves the WPF font-size combo permanently disabled after a COM exception
  • NullReferenceException on font-size apply when WebBrowser is null on WPF
  • 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
  • ZeroBorderTableService WPF constructor accepts null editor or document and throws NRE on first use
  • Silent exception swallow in HtmlFormatter.Format hides failures
  • Silent exception swallow in FilterMSWordHtmlHelper.LegacyCleanOfficeHtml hides failures
  • WPF SpellCheckerService.CleanupCurrentMisspelledWordStyle is an empty no-op leaving misspelled-word styling stuck on the caret word
  • WPF SpellCheckerService.CleanUpInlineSpellCheckMarkers is an empty no-op leaving red squiggles permanently visible
  • WPF SpellCheckerService.CleanupSelectedMisspelledWordsStyles is an empty no-op leaving selection styling stuck
  • Six silent catches in ContentService swallow GetBodyText, GetFormattedPlainText, GetBodyStyle, GetBrowserBodyStyle, GetRightToLeft, SetRightToLeft failures
  • TableManipulator cell-merge drag-select silently broken on WPF because WPF was using the WinForms TableManipulator whose HtmlDocument event hooks no-op when IWebBrowser.Document is null
  • Virtual factory called from base constructor causes NullReferenceException on WPF TableAuthoringService
  • 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
  • ShowGuidelinesForTablesWithZeroBorder(bool) silently ignores its parameter
  • HideGuidelineForZeroBorderTable has no synchronous overload, forcing callers to race the worker
  • WPF CheckIfPastingEventHandlerAttachedMethod returns null causing NullReferenceException in ClipboardService.ObtainPastingHtml
  • WPF ProductService used path concatenation ("\\" + name) breaking cross-platform safety, plus camelCase methods, productFIleSettingsPath typo, and silent catches
  • Word and Outlook HTML clipboard content was not auto-detected on Paste, forcing the user to know about and use the [W] toolbar button
  • Inserted Carriage Return Issue
  • Event HTMLChanged is not fired when text-alignment is changed
  • When the control is used under an Application Name (for example, testing in local IIS), the Paths are not resolved correctly.
  • Tab "Edges" in "BodyStyle" window does not show updated margin (shows old values) if margin has short format (not margin-top, margin-bottom, etc)
  • Header type cannot be changed to 'No Heading', if cursor is on empty next line before the header
  • 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.
  • 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.
Changed Interfaces
  • Assembly and root namespace renamed (WPF): the legacy WPF editor lived in assembly SpiceLogicWPFHtmlEditor.dll with root namespace SpiceLogic.WpfHtmlEditor. The modernized control lives in assembly SpiceLogic.HtmlEditor.WPF.dll with namespace SpiceLogic.HtmlEditor.WPF. Replace "using SpiceLogic.WpfHtmlEditor;" with "using SpiceLogic.HtmlEditor.WPF;" and update XAML xmlns references from clr-namespace:SpiceLogic.WpfHtmlEditor;assembly=SpiceLogicWPFHtmlEditor to clr-namespace:SpiceLogic.HtmlEditor.WPF;assembly=SpiceLogic.HtmlEditor.WPF. The control class name WpfHtmlEditor is preserved.
  • Distribution model changed from single DLL to NuGet packages. Install via Install-Package SpiceLogic.HtmlEditor.WPF.
  • Target framework switched from a single .NET Framework target to multi-targeting. The legacy WPF control targeted .NET Framework 4.8 only. The modernized package multi-targets net45;net472;net48;net5.0-windows through net10.0-windows.
  • License key is now set via a static LicenseKey property on the editor control. For WPF, set in App.xaml.cs at startup: WpfHtmlEditor.LicenseKey = "your-license-key-here"; before constructing any editor instance. Without a valid key the control runs in trial mode.
  • License-key activation replaces hardware-bound / file-based activation. ECDSA P-256 signed key string set via WpfHtmlEditor.LicenseKey. No license file deployment needed.
  • EditorModes enum values renamed to PascalCase (WysiwygDesign, HtmlEdit, ReadOnlyPreview) and moved to SpiceLogic.HtmlEditor.Abstractions.
  • WPF base class changed from Control to UserControl. The legacy WpfHtmlEditor derived from System.Windows.Controls.Control and used a XAML control template via Themes/Generic.xaml. The modernized WpfHtmlEditor is now a UserControl (defined in WpfHtmlEditor.xaml). Code that re-templated the editor via <Style TargetType="wpf:WpfHtmlEditor"><Setter Property="Template" .../> will no longer apply. To customize, subclass the control or add child elements through the public Toolbar1Items / Toolbar2Items collections rather than replacing the template.
  • Service interfaces moved to SpiceLogic.HtmlEditor.Abstractions.Services from the legacy SpiceLogic.HtmlEditorControl.Domain.Services namespace.
  • EventArgs classes moved. Shared ones to SpiceLogic.HtmlEditor.Abstractions.EditorEventArgs; WPF-specific to SpiceLogic.HtmlEditor.WPF.EditorEventArgs.
  • UserOption and SpellCheckerOption namespaces relocated. WPF UserOption is in SpiceLogic.HtmlEditor.WPF.Models.BOs.UserOptions.
  • New Language localization property added. In WPF this is also a DependencyProperty (LanguageProperty) so it can be bound. Defaults to EditorLanguage.EnglishUs. Setting Language auto-syncs the spell checker language.
  • New ShowPlaceholderToolbar mail-merge API on WPF, same shape as WinForms.
  • Removed IsFtpUploaderBusy property and FTPUpload_CompletedEvent routed event on WPF.
  • WPF events use new delegate types in new namespace. Routed events EditorModeChangedEvent, ErrorOccurredEvent, ContextMenuShowingEvent, StatusChangedEvent, HtmlElementClickedEvent, KeyDownEvent, PastingEvent, SpellCheckCompletedEvent are preserved by name, but the delegate types (ErrorOccurredEventHandler, ContextMenuShowingEventHandler, StatusChangedEventHandler, HtmlElementClickedEventHandler, MouseEventHandler, EditorKeyEventHandler, SpellCheckCompletedEventHandler, PastingEventHandler) are now declared in SpiceLogic.HtmlEditor.WPF instead of legacy SpiceLogic.WpfHtmlEditor. EventArgs types moved to SpiceLogic.HtmlEditor.WPF.EditorEventArgs. Update using directives in event handler files.
  • WPF toolbar property types FirstToolbar / SecondToolbar / FooterToolbar moved to a new namespace. The public properties Toolbar1, Toolbar2, ToolbarFooter still return FirstToolbar, SecondToolbar, FooterToolbar typed instances, but those classes moved from SpiceLogic.WpfHtmlEditor.Toolbars to SpiceLogic.HtmlEditor.WPF.Toolbars. Code that strongly types the result, e.g. FirstToolbar tb = editor.Toolbar1;, needs an updated using SpiceLogic.HtmlEditor.WPF.Toolbars;. Setters are now private set; use Toolbar1Items / Toolbar2Items collections instead of replacing whole toolbar instances.
  • ToolbarItemOverrideHelper moved from SpiceLogic.WpfHtmlEditor.ToolbarModule to SpiceLogic.HtmlEditor.WPF.ToolbarModule.
  • IDialogService interface moved to SpiceLogic.HtmlEditor.WPF.Models.Services with a shared IDialogServiceBase. The legacy WPF version inherited from IDialogServiceBase already; WinForms is now consistent.
  • WPF Content property now uses the new keyword to hide ContentControl.Content. Because the modernized WPF control derives from UserControl (which has its own Content property of type object), the editor's IContentService Content property is declared with public new IContentService Content. Code reading editor.Content continues to work and returns the IContentService, but XAML markup that accidentally tries to set <wpf:WpfHtmlEditor>...</wpf:WpfHtmlEditor> child content will compile-error. Do not place child content directly inside the editor element in XAML.
  • WPF Toolbar1, Toolbar2, ToolbarFooter setters made private. Customers cannot assign their own toolbar instances. To customize, use the Toolbar1Items / Toolbar2Items collections, the ToolbarItemOverrider hooks, or override per-button visibility via Options.
  • Same new UserOption / UserOptionBase properties added on WPF: FormatHtmlSource, UseHtml5DocType + DoctypeOverrideOptions, AutoDetectWordPaste, AutoResizeLargeImages, MaxPastedImageWidth, EditorLanguage, SpellCheckLanguage.
  • New public StateQuery APIs added: GetCurrentTable() and IsActiveOrAncestorElementTable().
  • Mail-merge public type surface added on WPF, same shape as WinForms (IMailMergeService, PlaceholderField, PlaceholderInserted event, sl-placeholder span class).
  • Project layout reorganized into Abstractions / Infrastructure / Core / Services / Resources. Inner libraries are private dependencies of the top-level NuGet package.
  • Service classes now inherit from shared ServiceBase with SafeExecute<T>. Visible to source-license customers.
  • TableManipulator decomposed into TableManipulatorBase + WinForms / WPF subclasses. WPF subclass wires events through the DhtmlEvents hub (also fixes WPF cell-merge drag-select bug).
  • ZeroBorderTableService split into Analyzer + Writer + orchestrator. Public API preserved via static forwarders.
  • FontLogic public API preserved as a 237-line facade with 7 SRP collaborators behind it.
  • Same Strings.resx + 13 culture variants shared with WinForms.
  • HtmlFormatter is a new public utility shared with WinForms.
  • ImageResizer.ClampImageWidths shared with WinForms.
  • TableElement getters now read CSS computed style as fallback (currentStyle / border-spacing).
  • [CLSCompliant(false)] attributes removed from public mshtml-using members; CLS-compliant consumers can now use them without warnings.
  • Right-click context menu has a new "View Source" item on WPF (parity with WinForms).