【问题标题】:.NET WPF WebBrowser Control: Insert HTML at ControlRange selection.NET WPF WebBrowser 控件:在 ControlRange 选择处插入 HTML
【发布时间】:2026-01-26 14:45:02
【问题描述】:

我有一个用于创建 HTML 编辑器的 WebBrowser 控件,并且我需要能够在文档的当前选择中插入一个 HTML 字符串。

一般来说,如果选择是文本选择,我可以这样做将 HTML 粘贴到当前选择:

IHTMLSelectionObject selection = webBrowser.Document.DomDocument.selection;

// Assume that selection.type == "Text"
IHTMLTxtRange textRange = selection.createRange() as IHTMLTxtRange;

textRange.pasteHTML(myHtmlString);

但是,如果当前选择是 ControlRange 选择,似乎没有任何直接的方法可以在该位置插入/粘贴 HTML。

例如:

// Assume that selection.type == "Control"
IHTMLControlRange ctrlRange = selection.createRange() as IHTMLControlRange;

// This throws an error, as IHTMLControlRange has no pasteHTML method
ctrlRange.pasteHTML(myHtmlString);

我知道我可以使用 HtmlElement.InsertAdjacentElement 方法在另一个元素之前或之后插入一个元素,但这是非常有限的,因为有时我需要能够插入原始 HTML,而不是需要创建一个 HtmlElement 对象首先为它。

有什么方法可以将 HTML 字符串粘贴/插入到插入符号位置或 ControlRange 选择范围内?

【问题讨论】:

    标签: c# .net wpf webbrowser-control


    【解决方案1】:

    我已经找到了解决此问题的方法,至少对于我的特定用例而言。

    IHTMLSelectionObject.createRange() 方法返回动态,但它将解析为 IHTMLTxtRange 或 IHTMLControlRange,具体取决于选择类型。 如果 selection.type == "Text" 或 selection.type == "None",则返回 IHTMLTxtRange,如果 selection.type == "Control",则返回 IHTMLControlRange。

    以下语句适用于空选择和文本选择:

    DomDocument.selection.createRange().pasteHTML(myHtml);
    

    但是,在粘贴控件选择的情况下,默认情况下上述语句不起作用,因为 createRange() 方法将返回一个 IHTMLControlRange,如上所述,它没有 createRange() 方法。但是,无论如何,我们都希望用新的 HTML 覆盖当前选择,因此可以假设清除选择(删除它)然后将 HTML 粘贴到新的空选择是安全的。

    解决方案

    这样的东西应该适用于所有类型的选择:

    // If we have a control selection, clear the selection
    if (DomDocument.selection.type == "Control")
        DomDocument.selection.clear();
    
    // Now it is no longer a control selection, but an empty text selection
    DomDocument.selection.createRange().pasteHTML(myHtml);
    

    这确实有点hacky,但它为我解决了问题。

    【讨论】: