5

WebBrowser在设计模式下使用控件。

webBrowser1.DocumentText = "<html><body></body></html>";
doc = webBrowser1.Document.DomDocument as IHTMLDocument2;
doc.designMode = "On";

我有一个保存按钮,我想根据控件的内容是否更改来启用或禁用它。

我还需要知道控件的内容何时发生更改,因为我需要阻止用户离开控件而不接受说明其更改将丢失的确认消息框。

我找不到任何可以让我知道内容已更改的事件。

4

4 回答 4

3

QueryInterface()的文件IMarkupContainer2,然后IMarkupContainer2::RegisterForDirtyRange用你自己的实现调用IHTMLChangeSinkIHTMLChangeSink::Notify进行更改时将调用您的实现。

注意:在设置设计模式后执行此操作。如果切换设计模式,文档会重新加载并且事件挂钩会丢失。

于 2012-06-22T19:46:27.900 回答
3

没有这样的事件,因为 DocumentText 是一个简单的字符串。我会创建一个字符串变量来存储最后保存的文本,并在每个 KeyDown / MouseDown / Navigating 事件中检查它。

string lastSaved;

private void Form_Load(object sender, System.EventArgs e)
{
   // Load the form then save WebBrowser text
   this.lastSaved = this.webBrowser1.DocumentText;
}

private void webBrowser1_KeyDown(object sender, System.Windows.Forms.KeyEventArgs e)
{
    // Check if it changed
    if (this.lastSaved != this.webBrowser1.DocumentText)
    {
        // TODO: changed, enable save button
        this.lastSaved = this.webBrowser1.DocumentText;
    }
}

private void webBrowser1_Navigating(object sender, WebBrowserNavigatingEventArgs e)
{
    // Check if it changed
    if (this.lastSaved != this.webBrowser1.DocumentText)
    {
        // TODO: ask user if he wants to save
        // You can set e.Cancel = true to cancel loading the next page
    }
}
于 2012-06-21T10:45:03.610 回答
0

这似乎有效 -QueryInterface()对于IPersistFile接口并使用IPersistFile::IsDirty方法,其返回值为S_OK(如果脏或设计模式文档已被修改)。

您不需要使用IPersistFile::Load将内容加载到网络浏览器中,WebBrowser->Navigate()也可以正常工作。

注意 - 在IPersistStreamIPersistStreamInit接口中也有相同的IsDirty()方法

我不使用 C#,但它应该相对容易重写。

bool IsEditorDirty(WebBrowser* WB)
    {
    // beware, if it fails to get Document and IPersistFile it will not register as dirty
    bool isdirty = false;

    IHTMLDocument2* pDoc2 = WB->Document;

    if (pDoc2) {
        IPersistFile* pPFile;

        if (pDoc2->QueryInterface(IID_IPersistFile, (void**)&diPFile) == S_OK) {
            isdirty = (pPFile->IsDirty() == S_OK);
            pPFile->Release();
            }
    
        pDoc2->Release();
        }

    return isdirty;
    }
于 2021-06-04T20:33:01.167 回答
0

另一种解决方案,如果你实施IDocHostUIHandler,你可以使用它的方法UpdateUI

于 2020-03-07T13:35:59.423 回答