Our journey began 11 years ago.

Since then, we have actively maintained and developed this product, listened to customer feedback, and improved it with every release.

289 bugs solved
49 features implemented
34 interfaces improved
95 product releases since 2015

Version 3.2.0

wpfHtmlEditor 3.2.0 fixes major WPF content/binding issues, safer paste/clipboard and Word import, spell-check crashes, table editing corruption, and file-save data loss risks.

79 bug fixes

Bug fixes 79

  1. Binding DocumentHtml inside a WPF tab
  2. Cut/delete text from a table is not possible.
  3. Mouse flicker on long text with enabled spell checking
  4. MS Word paste corrupted markup: final cleanup destroyed non-empty style/class attributes and corrupted tag names
  5. Table Cell Properties crashed on a fractional percentage width/height (unguarded int.Parse)
  6. Table Properties crashed on tables whose cell rowspan exceeded the actual row count
  7. Mail-merge / paste insertion could silently replace the entire document body when pasteHTML failed
  8. Cut/Delete could silently delete unselected content (e.g. an adjacent image) next to the selection
  9. Polish (and other code-page) spell-check dictionaries failed to load on .NET 5+ (encoding provider unregistered)
  10. Table structural edits could corrupt a different or since-modified table via a stale cached TableMap
  11. Decimal CSS font sizes were misread on non-English locales (float.Parse without InvariantCulture)
  12. Design/HTML round-trip corrupted documents: empty non-void elements were emitted without a closing tag
  13. Formatter dropped whitespace-only text nodes, merging adjacent inline words together
  14. Licensing could crash or mis-license on non-Gregorian-calendar locales (culture-sensitive DateTime.Parse of the release date)
  15. MS Word paste merged all lists into one and turned numbered lists into bullets
  16. MS Word paste stripped IE conditional comments (regressed the ALM #492 fix)
  17. Pasting an image from MS Word deleted it (VML stripped before image conversion ran)
  18. Opening a legacy ANSI/windows-1252 HTML file corrupted its text on .NET 5+ (Encoding.Default is UTF-8)
  19. Zero-border table guideline pass could permanently freeze the UI thread (lock + AutoResetEvent + BackgroundWorker deadlock)
  20. Reading BodyHtml before the document existed entered an unbounded message-pump loop (hang)
  21. Saving to a file deleted the existing file before the new content was written (data loss on failure)
  22. Hyperlink dialog: after removing one link, later OK silently unlinked instead of inserting (stale cached-dialog state)
  23. Style Builder re-applied stale CSS or silently wiped styles (property dictionary never cleared between opens)
  24. Style Builder silently deleted CSS values its combo boxes could not represent (display:flex, position:fixed, width:auto, etc.)
  25. Caret index API injected permanent sentinel text into WPF documents and returned 0
  26. WPF: GetBodyHtml returned an empty string in ReadOnlyPreview mode (content lost when the host saved)
  27. WPF: setting DocumentHtml in ReadOnlyPreview mode was silently dropped
  28. WPF: Table/Cell Properties dialog crashed when the table used rgb()/rgba() CSS colors
  29. WPF: MS Word paste auto-detection and cleanup never ran (IsMsWordContentInClipboard hard-coded to false)
  30. WPF: disabling Options.FormatHtmlSource was silently ignored (a shadowing 'new' property)
  31. WPF: editors hosted without a Window (ElementHost) were never disposed; removed editors stayed rooted
  32. WPF: BodyHtml/DocumentTitle set before the document existed were dropped, then the empty value written back over the bound source
  33. WPF: toolbar dialogs leaked a window per open via the static LocalizationManager.LanguageChanged event
  34. Email image-embedding crashed on an img without src, a short/empty src, or a malformed base64 data URI
  35. Selection-sync markers could be left permanently inside the user's document on a failed mode switch
  36. Cleanup TD-wrapping regex corrupted nested tables by matching a span across tag boundaries
  37. Table row/column span arithmetic errors (inserted extra cells, mis-sized grid crash, wrong column position, null-cell insert)
  38. Inline spell-check node cache was mutated concurrently from the background scan and UI threads with no synchronization
  39. Interactive spell-check pre-scan ran a full synchronous O(N^2) document scan on the UI thread on tables
  40. A relative Hunspell affix (.aff) path was not rooted against the app base directory, breaking after a CWD change
  41. German/Norwegian/Polish embedded NetSpell dictionaries broke on .NET Framework: .aff/.dic parsed as hardcoded UTF-8, ignoring the SET directive
  42. .NET Framework NetSpell user dictionary ignored the configured file path (read/saved under %APPDATA%\NetSpell instead)
  43. Inline spell-check debounce timer could crash the process by BeginInvoke on a just-disposed control
  44. .NET Framework spell-check suggestion generation raced the background scan (Suggest iterated a list the worker thread cleared)
  45. Mail-merge InsertPlaceholder silently dropped the insert before the document was ready yet still fired PlaceholderInserted claiming success
  46. Mail-merge placeholder emitted an unconditional trailing   that became permanent content and corrupted spacing in merged output
  47. Setting BaseUrl to null crashed the editor with a NullReferenceException on the timer path
  48. WPF: a family of content APIs (Get/SetBodyHtml, class name, body text, embed-images, etc.) silently no-op because the services used the WinForms-only browser.Document with no MSHTML fallback
  49. Paste deleted the current selection before checking there was anything to paste
  50. Set/get element-by-id APIs: NRE on null value, whole-document rewrite when the element is missing, and XPath breakage on IDs containing an apostrophe
  51. Print margins corrupted on non-English locales: culture-formatted decimals written into IE's margin registry values
  52. CanPaste threw when another process held the clipboard (unguarded Clipboard.ContainsImage)
  53. A UTF-8 clipboard probe overwrote the user's clipboard and lost all non-text formats during paste
  54. Parsing a style string with a duplicate CSS property name threw ArgumentException (duplicate declarations are legal CSS)
  55. Hyperlink/element HTML builders emitted attribute values without HTML encoding, corrupting markup when a value contained a quote
  56. Localization override JSON parser mangled escape sequences and mispaired keys for non-string values
  57. Turkish-I bug: list toggle/unlist broke on Turkish and Azerbaijani systems because tagName.ToLower() never matched "li"
  58. Insert Image dialog interpolated alt/title/src/class into the img tag with no HTML-attribute escaping - a double quote corrupted the document
  59. WPF trial-panel template part was not null-guarded: a custom ControlTemplate without spTrial crashed every instance, including licensed ones
  60. Editor teardown ran only on the first host window's Closed event - removed editors leaked native WebBrowser/mshtml resources and a re-parented editor was disposed while still in use
  61. Ctrl+Click hyperlink navigation worked only on the last anchor in the document (a single event-proxy field detached every previously attached anchor)
  62. ForceInlineSpellCheck threw NullReferenceException when called before the control template was applied
  63. Table Properties dialog crashed with UriFormatException on a relative background attribute
  64. Image dialog threw a raw unhandled exception when the imported file could not be verified on disk
  65. Style Builder Font tab injected 'color: #000000' into every style it edited, and the Background page crashed on function-form colors
  66. Case-sensitive string Replace defeated relative-path conversion, silently embedding machine-local absolute image paths
  67. WPFFolderBrowserDialog.Dispose() unconditionally threw, so any 'using' of this public IDisposable crashed
  68. ColorPicker ScA/ScR/ScG/ScB CLR properties were miswired and threw on any use
  69. Open toolbar button had no exception handling - an unreadable file crashed the host app
  70. Pasting an image with a non-writable local base-url folder crashed the host
  71. Search dialog handler unsubscribed from a freshly created dialog instance instead of the one that closed (leak / stale handler)
  72. Toolbar Search handler blanked PreloadedSearchText, killing the last-search-text pre-fill
  73. HtmlElementClickedEventArgs.EventData was never assigned - always null for subscribers
  74. Setting SpellCheckerOption.DictionaryFile = null threw NullReferenceException
  75. Designer property editor wiped DocumentHtml/BodyHtml to empty string when the edit dialog threw
  76. WPF debounced spell-check fire lacked the disposed guard the WinForms version has; a late fire hit a disposed spell-check service
  77. Replacing the public Options object at runtime silently broke option propagation and left a stale PropertyChanged subscription
  78. Typing into a misspelled (red-underlined) word lost the caret in WPF (WinForms saves/restores it)
  79. WPF preview mode always showed the raw IE context menu with no way to disable it (Options.DoNotShowContextMenuInPreviewMode existed only in WinForms)