Drive the editor from your own UI (menus, ribbons, buttons)
Olu builds the desktop client for a mid-market legal-tech firm. The product is a contract-drafting workstation: every paralegal in a fifty-person practice opens it every morning, and the UI is a full Office-style ribbon with tabs for Home, Insert, Review, and Compare. Customers grew up on Word, the product's design system grew up to match. There are no ToolStrips anywhere in the application - every command lives in the ribbon, every icon is a 32-pixel ribbon-style asset, and the visual language is non-negotiable.
The CTO has asked Olu to swap the legacy WPF rich-text control for WinFormHtmlEditor - it has the table tools, the paste-from-Word behavior, and the spell-checker the paralegals need. But the editor's built-in toolbars look nothing like the rest of the app, and the design lead has put a hard ban on shipping them.
Olu's plan: ribbon out, toolbars hidden
The editor's two factory toolbars get hidden the same way Linh did it on the code-review tool. Olu's real question is the other direction: how does he make his own ribbon buttons run the editor's commands? Specifically, the ones that pop dialogs - Insert Image, Insert Hyperlink, Insert Table, Find & Replace. He does not want to recreate those dialogs. They already work, they're localized, and they're hooked into the editor's services.
Reading the source, he finds WinFormHtmlEditor.ToolbarItemOverrider. It exposes one OnXxxButtonClicked(object sender, EventArgs e) method per built-in command. Calling one runs the exact same code path the matching factory button runs - dialog and all. The signature is the standard event signature, so any control event that matches it - Button.Click, ToolStripMenuItem.Click, his ribbon framework's RibbonButton.Click - can be attached directly.
Wiring the ribbon
private void ContractEditorForm_Load(object sender, EventArgs e)
{
htmlEditor1.Toolbar1.Visible = false;
htmlEditor1.Toolbar2.Visible = false;
var ov = htmlEditor1.ToolbarItemOverrider;
// Home tab.
ribbonBoldButton.Click += ov.OnBoldButtonClicked;
ribbonItalicButton.Click += ov.OnItalicButtonClicked;
ribbonUnderlineButton.Click += ov.OnUnderlineButtonClicked;
// Insert tab - these pop the editor's dialogs.
ribbonImageButton.Click += ov.OnImageButtonClicked; // Image dialog
ribbonHyperlinkButton.Click += ov.OnHyperLinkButtonClicked; // Hyperlink dialog
ribbonTableButton.Click += ov.OnTableInsertButtonClicked; // Table dialog
// Review tab.
ribbonFindButton.Click += ov.OnSearchButtonClicked; // Find/Replace dialog
ribbonSpellCheckButton.Click+= ov.OnCheckSpellingButtonClicked;
}
The complete handler menu
By the time Olu has wired the Home tab, he has the rest of the patterns down. The ToolbarItemOverrider exposes a handler for every built-in action:
- Formatting:
OnBoldButtonClicked,OnItalicButtonClicked,OnUnderlineButtonClicked,OnStrikeThroughButtonClicked,OnSubscriptButtonClicked,OnSuperScriptButtonClicked,OnFormatResetButtonClicked. - Insert:
OnImageButtonClicked,OnHyperLinkButtonClicked,OnTableInsertButtonClicked,OnSymbolInsertButtonClicked,OnHorizontalRuleButtonClicked,OnYouTubeVideoInsertButtonClicked. - Layout:
OnAlignLeftButtonClicked,OnAlignCenterButtonClicked,OnAlignRightButtonClicked,OnIndentButtonClicked,OnOutdentButtonClicked,OnOrderedListButtonClicked,OnUnOrderedListButtonClicked. - Color and style:
OnFontForeColorButtonClicked,OnTextHighlightColorButtonClicked,OnBodyStyleButtonClicked. - Document I/O:
OnNewButtonClicked,OnOpenButtonClicked,OnSaveButtonClicked,OnPrintButtonClicked. - Edit operations:
OnCutButtonClicked,OnCopyButtonClicked,OnPasteButtonClicked,OnPasteFromMsWordButtonClicked,OnUndoButtonClicked,OnRedoButtonClicked. - Tools:
OnSearchButtonClicked,OnCheckSpellingButtonClicked.

Olu vs. Linh: when to pick which
Linh's code-review comment box used ToolbarItemOverrider.ToolbarItems to rehost the editor's actual ToolStripButton instances in her own ToolStrip. That kept icons, tooltips, and pressed-state automatic - because the same buttons were still doing the work. Olu can't do that: his ribbon framework doesn't accept ToolStripButton children at all. His buttons are RibbonButton objects with their own icon assets and their own visual states. The OnXxxButtonClicked handlers are the bridge - they let his ribbon stay his ribbon while still running the editor's exact command behavior.
When the QA team finishes regression testing, they file zero bugs against Find/Replace, Insert Hyperlink, and Insert Table - the dialogs they hit through Olu's ribbon are the same dialogs the editor would have shown through its factory toolbar. The CTO greenlights ship.