Internet Explorer 9 RC останавливает мой элемент управления WinForms WebBrowser для работы в режиме редактирования

С использованием IHtmlDocument2.designMode свойство установлено в On переключить WebBrowser управление, размещенное в форме Windows Forms, в режиме редактирования неожиданно перестало работать после установки Microsoft Internet Explorer 9 RC.

Вопрос:

Есть ли шанс исправить это?

Я уже пытался настроить с doctype или с EmulateIE7 метатег но безуспешно

(Примером будет этот проект)


Обновление 2011-02-21:

Как предложил EricLaw, я настроил пример "Зета", чтобы задать текст документа перед установкой режима редактирования.

К сожалению, мне также не удалось перейти в режим дизайна.


Обновление 2011-02-24:

Части обсуждения также проходят в блоге Эрика.


Обновление 2011-02-26:

Что я в настоящее время испытываю, так это то, что поведение выглядит по-разному для HTTP-URL и для контента, который был добавлен через WebBrowser.DocumentText,

Первые тесты, кажется, подтверждают это предположение.

Сейчас я собираюсь построить решение на основе этого предположения и опубликовать обновления и подтверждение концепции здесь.


Обновление 2011-02-26 (2):

Сейчас я создал пробную версию со встроенным веб-сервером, который, как мне кажется, также хорошо работает с IE 9. Если кто-то захочет скачать и проверить, работает ли он, и дать мне короткую обратную связь, я могу очистить и выпустить исходный код для этого.


Обновление 2011-02-26 (3):

Пока нет отзывов, я все еще обновил статью HTML Edit Control и демонстрацию в Code Project.


Обновление 2011-03-16:

Так как Internet Explorer 9 был выпущен вчера, мы обновили наши основные продукты, чтобы использовать идею с интегрированным веб-сервером, как описано в статье HTML Edit Control.

После почти месяца тестирования, я думаю, что это работает довольно хорошо.

Если у вас возникнут какие-либо проблемы в будущем с этим подходом, пожалуйста, оставьте свои комментарии здесь, и я могу исследовать и исправить.

9 ответов

Решение

Вчера был выпущен Internet Explorer 9 RTM.

Я сделал еще несколько крошечных изменений в своем контроле, но в принципе идея с интегрированным небольшим веб-сервером, кажется, работает довольно хорошо.

Таким образом, решение находится в этой статье Code Project:

Zeta HTML Edit Control
Небольшой класс-оболочка для элемента управления Windows Forms 2.0 WebBrowser

Это было единственное решение, которое сработало для меня.

Я надеюсь, что все в порядке, чтобы ответить на мой собственный вопрос и пометить мой ответ как "отвеченный", также?!?

У меня была похожая проблема, и я решил ее, добавив следующую строку в событие DocumentCompleted:

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

Нам просто нужен пустой редактируемый элемент управления. Однако я прошел через отладчик и добавил значение в InnerHtml элемента управления, и он хорошо отобразился, и я смог его отредактировать.

Небольшое обновление, мы смогли получить редактируемый элемент управления также с помощью этой строки:

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

Это позволяет нам избегать ссылки на mshtml (не обязательно включать Microsoft.mshtml.dll)

Это позволяет нам не увеличивать размер установки на 8 мегабайт.

Какой у вас точный код?

Если я установлю следующий код:

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

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

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

Экземпляр браузера IE9 входит в designMode без каких-либо проблем. Если вы измените пример "Zeta", чтобы не вводить текст документа после входа в режим разработки, он также работает нормально.

Просто хочу добавить, что я также не могу войти в режим проектирования (в моем случае используется элемент управления WebBrowser). Это не было проблемой в бета-версии. Определенно новый с RC.

Это исправлено, если свойство установлено после загрузки документа

private void DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{

    IHTMLDocument2 Doc = Document.DomDocument as IHTMLDocument2;
    Doc.designMode = @"On";
}

Другой пользователь Code Project предложил использовать следующий код:

Сначала добавьте событие DocumentCompleted:

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

Затем напишите функцию:

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

Хотя я не проверял это, я хочу документировать это здесь для полноты.

Я также смог заставить это работать, используя следующее внутри события DocumentCompleted:

IHTMLDocument2 Doc = browserControl.browser.Document.DomDocument as IHTMLDocument2;
if (Doc != null) Doc.designMode = @"On";

Спасибо всем!

Я использую HTML Editor Control, я решил эту проблему, добавив DocumentComplete событие

private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
    (((sender as WebBrowser).Document.DomDocument as IHTMLDocument2).body as HTMLBody).contentEditable = "true"; 
}
Другие вопросы по тегам