4 Stimmen

Internet Explorer 9 RC stoppt meine WinForms WebBrowser-Steuerung daran zu arbeiten im Bearbeitungsmodus.

Mit der IHtmlDocument2.designMode Eigenschaft auf On gesetzt, um einen WebBrowser control, welcher auf einem Windows Forms Form gehostet wird, plötzlich in den Bearbeitungsmodus zu versetzen, funktionierte nicht mehr, nachdem Microsoft Internet Explorer 9 RC installiert wurde.

Frage:

Gibt es eine Möglichkeit, dies zu beheben?

Ich habe bereits versucht, mit dem Doctype oder dem EmulateIE7 Meta-Tag herumzuspielen, aber ohne Erfolg.

(Ein Beispiel wäre dieses Projekt)


Update 2011-02-21:

Wie Eric Lawrence vorschlug, habe ich das "Zeta" Beispiel angepasst, um den Dokumententext festzulegen, bevor der Bearbeitungsmodus festgelegt wird.

Leider ist es mir auch so nicht gelungen, in den Design-Modus zu wechseln.


Update 2011-02-24:

Teile der Diskussion finden auch in Erics Blog statt.


Update 2011-02-26:

Was ich derzeit erlebe, ist, dass das Verhalten anscheinend für HTTP URLs und für Inhalte, die über WebBrowser.DocumentText hinzugefügt wurden, unterschiedlich ist.

Erste Tests scheinen diese Annahme zu bestätigen.

Ich werde nun eine Lösung um diese Annahme herum entwickeln und Updates sowie einen Proof-of-Concept hier veröffentlichen.


Update 2011-02-26 (2):

Ich habe nun einen Proof-of-Concept mit einem eingebauten Webserver erstellt, von dem ich glaube, dass er auch gut mit IE 9 funktioniert. Falls jemand möchte, kann er herunterladen und testen, ob es funktioniert, und mir ein kurzes Feedback geben. Dann kann ich den Quellcode dafür aufräumen und veröffentlichen.


Update 2011-02-26 (3):

Bisher kein Feedback, ich habe den HTML Edit Control Artikel und das Demo noch auf Code Project aktualisiert.


Update 2011-03-16:

Nachdem Internet Explorer 9 gestern veröffentlicht wurde, haben wir unsere Hauptprodukte aktualisiert, um die Idee mit dem integrierten Webserver zu verwenden, wie im HTML Edit Control Artikel beschrieben.

Nach fast einem Monat Test bin ich der Meinung, dass es ganz gut funktioniert.

Sollten Sie in Zukunft Probleme mit diesem Ansatz haben, hinterlassen Sie bitte Ihre Kommentare hier, damit ich diese überprüfen und beheben kann.

1 Stimmen

Ich habe dies im IE 9 RC Feedback protokolliert, zusammen mit einem Link zu dieser Seite. Ich habe das gleiche Problem mit meinem bestehenden Code, der auf etwas bei Code Project basiert. Ich denke dies: codeproject.com/KB/edit/editor_in_windows_forms.aspx

0 Stimmen

@PeteT Kannst du hier einen Link zur IE 9 RC Feedback-Seite deines Beitrags posten?

1 Stimmen

Ja, sicher, ich habe das Feedback über das IE 9-Menü eingegeben, das schließlich auf ihrer Connect-Website landet: connect.microsoft.com/IE/feedback/details/648138/…

8voto

LaughingJohn Punkte 101

Ich hatte ein ähnliches Problem und konnte es umgehen, indem ich die folgende Zeile zum DocumentCompleted-Ereignis hinzugefügt habe:

 ((HTMLBody)_doc.body).contentEditable = "true";

1 Stimmen

Das hat bei mir funktioniert. Meine Apps WebBrowser-Bearbeitung funktioniert jetzt mit ie9. win7-64, ie9-64.

2 Stimmen

Sehr hilfreich auch... aber brauchte auch @Michael's Code, um alles fest zu machen.

1 Stimmen

@John du rockst! IE macht mir jedes Mal das Leben schwer... Kleiner Kommentar, DocumentCompleted verwendet sender (Browser) und Document ist ein HtmlDocument-Objekt, ich hatte ein paar Probleme mit dem Casten. Hier sind die Eigenschaften gelöst in einer Zeile, falls es sonst noch jemand braucht (((sender as WebBrowser).Document.DomDocument as IHTMLDocument2).body as HTMLBody).contentEditable = "true";

2voto

Wir benötigen nur eine leere bearbeitbare Steuerelement. Ich bin jedoch durch den Debugger gegangen und habe dem InnerHtml des Steuerelements einen Wert hinzugefügt und es wurde korrekt angezeigt, und ich konnte es bearbeiten.

Kleines Update, wir konnten das Steuerelement auch mit dieser Zeile bearbeitbar machen:

browserControl.browser.Document.Body.SetAttribute("contentEditable", "true");

Dies ermöglicht es uns, mshtml nicht zu referenzieren (müssen Microsoft.mshtml.dll nicht einbeziehen)

Dies ermöglicht es uns, die Installationsgröße um 8 Megabyte zu reduzieren.

1 Stimmen

Glückspilz! Ich habe alles ähnlich gemacht, wie du es beschrieben hast. Während es auf den meisten Maschinen funktioniert hat, gab es einige, wo es nicht funktioniert hat :-( Dringend auf der Suche nach einem stabilen Chrome .NET Wrapper...

1voto

EricLaw Punkte 55641

Was ist dein genauer Code?

Wenn ich den folgenden Code setze:

    private void cbDesign_CheckedChanged(object sender, EventArgs e){
        var instance =
    Microsoft.VisualBasic.CompilerServices.NewLateBinding.LateGet(
    wbView.ActiveXInstance,
    null,
    @"Dokument",
    new object[0],
    null,
    null, null );

         var objArray1 = new object[] { cbDesign.Checked ? @"An" : @"Aus" };

    Microsoft.VisualBasic.CompilerServices.NewLateBinding.LateSetComplex(
    instance,
    null,
    @"designMode",
    objArray1,
    null,
    null,
    false,
    true );

Das IE9 Webbrowser-Instanz wechselt problemlos in den designMode. Wenn Sie das "Zeta"-Beispiel ändern, um nach dem Wechsel in den Designmodus keinen Dokumententext festzulegen, funktioniert es auch einwandfrei.

0 Stimmen

Vielen Dank, Eric. Die grundlegenden Schritte, die ich unternehme (und die bisher immer funktioniert haben), ist den Design-Modus im OnDocumentCompleted Ereignis zu setzen. Mit der neuesten Version von IE 9 wechselt dies einfach nicht mehr in den Design-Modus (im IE 9 beta funktionierte es, aber zeigte den Cursor nicht mehr an). Ich habe bereits einen anderen Weg ausprobiert, um nicht den Design-Modus zu setzen, sondern das contentEditable Attribut des Tags auf true zu setzen. (hier ist die Quelle dazu). Ich werde nun versuchen, mein Beispiel entsprechend zu ändern, wie du geschrieben hast, um den Dokumententext nicht nach dem Wechsel in den Design-Modus zu setzen.

0 Stimmen

Noch eine Frage: Können Sie sich vorstellen, warum das "Zeta" Beispiel nicht mehr standardmäßig mit IE9 RC funktioniert? Habe ich mich auf ein nicht definiertes Verhalten von IE6, 7 und 8 verlassen? Oder handelt es sich um eine neue Sicherheitsbeschränkung?

1voto

Peter Cross Punkte 21

Möchte nur hinzufügen, dass ich auch nicht in den Designmodus wechseln kann (bei Verwendung einer WebBrowser-Steuerung in meinem Fall). Das war im Beta-Stadium kein Problem. Definitiv neu mit dem RC.

0 Stimmen

Danke. Ich habe gerade einen Proof-of-Concept erstellt. Funktioniert es mit Ihrer IE 9 Installation?

0 Stimmen

Danke! Du kannst versuchen, einen Blick auf meinen Code im Beispiel für den HTML-Bearbeitungssteuerung zu werfen und sehen, ob er auch für deine Bedürfnisse geeignet ist.

1voto

Uwe Keim Punkte 38139

Ein weiterer Benutzer von Code Project hat vorgeschlagen, den folgenden Code zu verwenden:

Zuerst fügen Sie das Ereignis DocumentCompleted hinzu:

private void SetupEvents()
{
    webBrowser1.Navigated += webBrowser1_Navigated;
    webBrowser1.GotFocus += webBrowser1_GotFocus;
    webBrowser1.DocumentCompleted += this.theBrowser_DocumentCompleted;
}

Dann schreiben Sie die Funktion:

private void theBrowser_DocumentCompleted(
    object sender, 
    WebBrowserDocumentCompletedEventArgs e)
{
    webBrowser1.Document.Write(webBrowser1.DocumentText);
    doc.designMode = "On";
}

Obwohl ich das nicht getestet habe, möchte ich es hier zur Vollständigkeit dokumentieren.

1 Stimmen

Ich glaube, dass diese Methode funktionieren könnte. Ich habe endlich begonnen, mein Projekt zu überprüfen und das webBrowser_GotFocus-Ereignis verwendet, um den designMode zu setzen. Ich habe dieses Ereignis verwendet, weil mein Projekt mehrere Webbrowser-Steuerungen hat, die auf dieselben Ereignisse reagieren, sodass es mir einfach gemacht wurde.

1 Stimmen

Bitte löschen Sie, dass ich zu früh gesprochen habe, es funktioniert, es im Designmodus zu platzieren, aber wie Sie gesagt haben, wird es jedes bereits hinzugefügte Inhalte löschen.

0 Stimmen

@PeteT - Ja, deshalb habe ich den eingebetteten Webserver in die Bibliothek eingefügt. Ich habe wirklich keinen anderen zuverlässigen Weg gefunden als diesen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X