C# 如何检测WebBrowser控件的内容何时发生更改(在设计模式下)?

C# 如何检测WebBrowser控件的内容何时发生更改(在设计模式下)?,c#,webbrowser-control,C#,Webbrowser Control,我正在设计模式下使用WebBrowser控件 webBrowser1.DocumentText=; doc=webBrowser1.Document.DomDocument作为IHTMLDocument2; doc.designMode=On; 我有一个保存按钮,我想根据控件的内容是否更改来启用或禁用它 我还需要知道控件的内容何时发生了更改,因为我需要阻止用户在不接受确认消息框的情况下离开控件,该消息框声明他们的更改将丢失 我找不到任何可以让我知道内容已更改的事件。没有此类事件,因为Docume

我正在设计模式下使用WebBrowser控件

webBrowser1.DocumentText=; doc=webBrowser1.Document.DomDocument作为IHTMLDocument2; doc.designMode=On; 我有一个保存按钮,我想根据控件的内容是否更改来启用或禁用它

我还需要知道控件的内容何时发生了更改,因为我需要阻止用户在不接受确认消息框的情况下离开控件,该消息框声明他们的更改将丢失


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

没有此类事件,因为DocumentText是一个简单的字符串。 我将创建一个字符串变量来存储上次保存的文本,并在每次KeyDown/MouseDown/navigation事件中检查它

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
    }
}
QueryInterface IMarkupContainer2的文档,然后使用自己的IHTMLChangeSink实现调用IMarkupContainer2::RegisterForderTyrange。进行更改时,将调用IHTMLChangeSink::Notify实现


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

另一种解决方案,如果实现IDocHostUIHandler,则可以使用其方法UpdateUI

这似乎有效-QueryInterface for interface,如果脏或设计模式文档已被修改,则使用返回值为S_OK的方法

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

注意-和接口中也有相同的IsDirty方法

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

bool iseditordywebbrowser*WB { //注意,如果它无法获取文档和IPersistFile,它将不会注册为脏文件 bool-isdirty=false; IHTMLDocument2*pDoc2=WB->Document; 如果pDoc2{ IPersistFile*pPFile; 如果pDoc2->QueryInterfaceIID_IPersistFile,则void**&diPFile==S_确定{ isdirty=pPFile->isdirty==S_确定; pPFile->Release; } pDoc2->释放; } 回报率; }
别这样。设计模式是为程序员设计的,他们有源代码控制来清理大混乱。用“你确定吗?”的提示向他发送垃圾邮件是很烦人的,他肯定99.9%的时间都是这样。如果你想写javascript,你是什么意思?这是一个WinForms应用程序,允许用户在web浏览器控件中编辑一些HTML内容。他们从树视图中选择正在编辑的内容,我需要与他们确认,如果他们试图导航而不保存,他们会丢失更改。这不是一个web应用程序。这听起来是一个很好的实现,但对我的技能水平来说有点太抽象了。您能给出一个代码示例吗?我没有看到System.Windows.Forms.WebBrowser的按键事件-它支持的唯一按键事件是PreviewKeyDown。这不考虑是否按下了TAB键或箭头键。此外,当图像被调整大小、移动等时,它不会注册更改。请参阅我的解决方案。