WPF WebBrowser-Steuerelement nicht Design-Modus, wenn das Dokument Eigenschaft geändert wird

StackOverflow https://stackoverflow.com/questions/1766084

Frage

ich eine frustrierende Problem haben. Hier ist eine vereinfachte Version von dem, was ich tue:

Ein Usercontrol in c # enthält eine Symbolleiste und ein integriertes Web-Browser-Objekt. Die Symbolleiste enthält eine Schaltfläche „Bearbeiten“, die, wenn sie setzt das WebBrowser-Steuerelement im Entwurfsmodus angeklickt. Eine weitere Taste "Abbrechen", schaltet sich aus Design-Modus.

Pseudocode (sehr vereinfacht):

public void SetDesignMode(bool dm) {
  IHTMLDocument2 doc = webBrowser.Document as IHTMLDocument2;
  if (dm) doc.designMode = "On";
  else doc.designMode = "Off";
  _designMode = dm;
  ReloadDocument(); // setting designmode clears the document element, so it must be reloaded
}

public void OnLoadCompleted() {
  IHTMLDocument2 doc = webBrowser.Document as IHTMLDocument2;
  if (!_documentLoaded) {
    if (_designMode) doc.designMode = "On";
    else doc.designMode = "Off";
    ReloadDocument();
    _documentLoaded = true;
  }
}

public void ReloadDocument() {
  _documentLoaded = false;
  // code that navigates to the document
}

Das Problem: Wenn ich auf der angezeigten Webseite und klicken Sie dann auf die Schaltfläche „Bearbeiten“, wird das WebBrowser-Steuerelement nicht bearbeitet werden. Der Mauszeiger, wenn Bilder hoovering über / Links zeigen die Navigation Mauszeiger Web-Browser, nicht die Bearbeitung diejenigen. Wenn ich in dem Text klicken, wird nicht angezeigt, das Caret.

Debuggen zeigt, dass die Eigenschaft designmode auf dem Dokument tatsächlich auf „On“ in dieser Situation festgelegt ist, aber die Steuerung verhält, als ob es auf „Aus“.

Wenn ich nicht Klicken Sie in der Web-Seite, bevor Sie die Schaltfläche "Bearbeiten" klicken, alles wie erwartet funktioniert .

Ausarbeitung: Wenn ich auf die Schaltfläche „Abbrechen“, wenn die Steuerung im Entwurfsmodus ist, dass ich das entsprechende (mis) Verhalten erhalten, wenn das Dokument in geklickt hat.

Sie einfach auf „Bearbeiten“ und dann auf „Abbrechen“, dann „Bearbeiten“ usw., ohne jemals in dem Dokument klicken, funktioniert einwandfrei (der Mouseover-Test zeigt den richtige Maus-Zeiger, und ich Link-Navigation oder Bearbeitung je nach Ausführung Modus, wenn ich einen Link in dem angezeigten Dokument anklicken).

Ich habe verschiedene Techniken ausprobiert, um sicherzustellen, dass eine andere Steuer Fokus erhält, bevor ich die Eigenschaft ändern designmode, aber es macht keinen Unterschied machen. Ich habe gesucht MSDN und die Hälfte des bekannten Internet und fand habe keine Erwähnung dieser Art von Problem. Das Umlegen der designmode Eigenschaft wie das scheint ziemlich ungewöhnlich zu sein.

Eine weitere Leckerbissen der Informationen: Ich Einrichtung Dokumentereignisse durch das Dokument mit einem Waschbecken Beratung durch die Usercontrol umgesetzt. Ich bezweifle, dass dies das Problem keinerlei Einfluss haben sollte, aber ich habe es hier aus Gründen der Vollständigkeit enthalten. Update:. das Deaktivieren nichts über das Problem ändern

Hat jemand dieses Problem erkennen?

Update: Ich habe, um das Problem durch erneute Erstellung des Web-Browser-Steuerelement in SetDesignMode gearbeitet (). Es ist eine hässliche Lösung, aber es funktioniert und sieht eigentlich ganz in Ordnung. Ich bin in jedem Feedback zu diesem Problem sehr interessiert, though. Ich glaube, dass es ein Fehler in MSHTML ist.

War es hilfreich?

Lösung

Ich bin mir nicht ganz sicher, ob wir genau das gleiche Problem hatte, aber ich meine Lösung annehmen sollte auch für Sie arbeiten.

Das grundlegende Problem scheint, dass x64 setzen Sie das Attribut designmode, wie in dieser Artikel . In meinem Fall, habe ich es auf „On“ nach dem Web-Browser instanziiert wird, aber in der Document Ereignis, es sei „Vererben“ wieder. Eine Einstellung wieder auf „On“ in Document macht es editierbar, aber das Dokument gelöscht wird. den Documenttext wieder einstellen startet den ganzen Teufelskreis.

So eine Lösung gefunden war ich zu unterlassen, die Documenttext-Einstellung, stattdessen habe ich ein leeres Dokument, dann wird der Körper gesetzt (die an dieser Stelle nicht mehr null) Innerhtml Eigenschaft:

doc.designMode = "On"; // enable editing

// designMode change resets the document, create it anew
webBrowser1.Document.Write("<html><body></body></html>")
webBrowser1.Document.Body.InnerHtml = "myDocumentText"

Natürlich funktioniert dies nur, wenn Sie den Text fertig haben, und nicht, wenn Sie eine URL der Navigation. Allerdings gibt es eine andere Lösung, die für mich gearbeitet, die einfacher und sicherer zu sein scheint. Ich fand es in diese Antwort von LaughingJohn. Ich denke, die erste Zeile hängt von Ihrer Anwendung, können Sie die IHTMLDocument direkt in webBrowser1.Document hatten.

doc = webBrowser1.Document.DomDocument as IHTMLDocument2;
if (doc != null && doc.body != null)
    ((HtmlBody)doc.body).contentEditable = "true";

Andere Tipps

Es klingt für mich wie die WebBrowser den Fokus erhält, wenn Sie darauf klicken und hält irgendwie auf sie. Versuchen Sie, diese: klicken Sie auf den WebBrowser, und drücken Sie die Tab-Taste auf der Tastatur (die sollte den Fokus weg von der WebBrowser bewegen) und dann sehen, wenn Sie auf Ihre Tasten klicken können

.

Wenn Sie können, dann versuchen, einen Handler zum Button.MouseEnter Ereignisse Anbringen und Call ((Button)sender).Foucs() darin auf die Schaltfläche programmatisch zu konzentrieren.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top