5

WebBrowserデザインモードでコントロールを使用しています。

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

コントロールの内容が変更されたかどうかに応じて有効または無効にしたい保存ボタンがあります。

また、変更が失われることを示す確認メッセージボックスを受け入れずに、ユーザーがコントロールから離れるのを防ぐ必要があるため、コントロールの内容がいつ変更されたかを知る必要があります。

内容が変わったことを知らせるイベントが見つかりません。

4

4 に答える 4

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 に答える
3

QueryInterface()のドキュメントを作成してから、独自の実装を使用してIMarkupContainer2呼び出します。変更が行われると、実装が呼び出されます。IMarkupContainer2::RegisterForDirtyRangeIHTMLChangeSinkIHTMLChangeSink::Notify

注:これは、デザインモードを設定した後で行います。デザインモードを切り替えると、ドキュメントが再読み込みされ、イベントフックが失われます。

于 2012-06-22T19:46:27.900 に答える
0

別の解決策、実装する場合IDocHostUIHandlerは、そのメソッドを使用できますUpdateUI

于 2020-03-07T13:35:59.423 に答える
0

これは機能しているようQueryInterface()です-IPersistFileインターフェイスの場合、戻り値が(ダーティの場合、またはデザインモードドキュメントが変更されている場合)のIPersistFile::IsDirtyメソッドを使用します。S_OK

IPersistFile::LoadコンテンツをWebブラウザにロードするためにを使用する必要はありませんWebBrowser->Navigate()。また、正常に機能します。

-IPersistStreamおよびIPersistStreamInitインターフェース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 に答える