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

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

Вопрос:

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

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

(Примером может быть этот проект)


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

Как предложил Эрик Лоуренс, я скорректировал " Zeta "example для установки текста документа перед установкой режима редактирования.

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


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

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


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

В настоящее время я понимаю, что поведение URL-адресов HTTP и контента, добавленного через WebBrowser.DocumentText, похоже, различается.

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

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


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

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


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

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


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

Поскольку вчера был выпущен Internet Explorer 9, мы обновили наши основные продукты, чтобы использовать эту идею со встроенным веб-сервером, как описано в Статья о редактировании HTML.

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

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


person Uwe Keim    schedule 15.02.2011    source источник
comment
Я зарегистрировал это в обратной связи IE 9 RC вместе со ссылкой на эту страницу. У меня такая же проблема с моим существующим кодом, который был основан на чем-то в проекте кода. Я думаю так: codeproject.com/KB/edit/editor_in_windows_forms.aspx   -  person PeteT    schedule 28.02.2011
comment
@PeteT Можете ли вы разместить здесь ссылку на страницу обратной связи вашего сообщения об IE 9 RC?   -  person Uwe Keim    schedule 28.02.2011
comment
Да, конечно, я поместил отзыв через меню IE 9, которое заканчивается на их сайте подключения: connect.microsoft.com/IE/feedback/details/648138/   -  person PeteT    schedule 28.02.2011
comment
@PeteT Спасибо! Просто примечание для других, щелкнув ссылку PeteT: сначала вам нужно присоединиться к соединению с программой IE 9, иначе вы получите сообщение о том, что документ не найден (или подобное).   -  person Uwe Keim    schedule 28.02.2011
comment
Ах да, извините, я думал, что это будет просто ссылка на вход с живым идентификатором, если вы не присоединились к программе подключения.   -  person PeteT    schedule 01.03.2011


Ответы (9)


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

 ((HTMLBody)_doc.body).contentEditable = "true";
person LaughingJohn    schedule 16.03.2011
comment
Это сработало для меня. Мои приложения Редактирование WebBrowser теперь работает с ie9. win7-64, ie9-64. - person P a u l; 20.04.2011
comment
Тоже очень полезно ... но нужен код @ Michael, чтобы все было хорошо. - person John; 01.05.2011
comment
@ Джон, ты рок! IE каждый раз усложняет мою жизнь ... Небольшой комментарий, DocumentCompleted использует отправителя (браузер), а Document - объект HtmlDocument, у меня было несколько проблем с преобразованием. Вот решения с добавлением свойств в 1 строку, если это кому-то еще нужно (((sender as WebBrowser).Document.DomDocument as IHTMLDocument2).body as HTMLBody).contentEditable = "true"; - person Alex; 01.11.2011

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

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

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

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

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

person Michael Herchenroder    schedule 21.04.2011
comment
Повезло тебе! Я сделал все, что вы описали. Хотя это работало на большинстве машин, у меня были некоторые, где это не работало :-( Срочно ищу стабильную оболочку Chrome .NET ... - person Uwe Keim; 21.04.2011
comment
Спасибо за это. Это ИМЕННО то, что мне нужно. - person John; 01.05.2011

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

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

    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», чтобы текст документа не устанавливался после входа в режим дизайна, он также будет работать нормально.

person EricLaw    schedule 21.02.2011
comment
Большое спасибо, Эрик. Основные шаги, которые я предпринимаю (и это работает уже много лет), - это установить режим дизайна в событии OnDocumentCompleted. В новейшей версии IE 9 он просто больше не переключается в режим разработки (в IE 9 beta он переключился, но больше не отображает курсор). Я пробовал еще один способ не устанавливать режим дизайна, а установить атрибут contentEditable тега <body> на true. (это его источник). Теперь я попытаюсь изменить свой пример, как вы писали, чтобы не устанавливать текст документа после входа в режим разработки. - person Uwe Keim; 21.02.2011
comment
Еще один вопрос: можете ли вы представить, почему пример Zeta больше не работает «из коробки» с IE9 RC? Полагался ли я на неопределенное поведение IE6,7 и 8? Или это новое ограничение безопасности? - person Uwe Keim; 21.02.2011

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

person Peter Cross    schedule 25.02.2011
comment
Спасибо. Я только что создал проверку концепции. Это работает с вашей установкой IE 9? - person Uwe Keim; 26.02.2011
comment
Спасибо! Вы можете попробовать взглянуть на мой код в примере HTML Edit Control и посмотрите, подходит ли он для ваших нужд. - person Uwe Keim; 28.02.2011

Другой пользователь 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";
}

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

person Uwe Keim    schedule 16.03.2011
comment
Думаю, этот метод может сработать. Я наконец дошел до своего проекта и использовал событие webBrowser_GotFocus, чтобы установить designMode. Я использовал это событие, потому что в моем проекте есть несколько элементов управления веб-браузером, отвечающих на одни и те же события, поэтому мне стало проще. - person PeteT; 21.03.2011
comment
Отмените то, что я говорил слишком рано, он действительно работает, чтобы перевести его в режим дизайна, но, как вы сказали, он уничтожит любой контент, который вы уже добавили. - person PeteT; 21.03.2011
comment
@PeteT - Да, именно поэтому я поставил встроенный веб-сервер внутрь библиотеки. Я действительно не нашел другого надежного способа, кроме этого. - person Uwe Keim; 21.03.2011
comment
Поиграв со своим кодом, я обнаружил, что параметр ((HTMLBody) _doc.body) .contentEditable = true; в событии DocumentCompleted у меня работает после некоторых других изменений. Не могу сказать, что это идеально, но я тоже не особо хочу добавлять WebServer. Я думаю, раз уж он у меня работает, я оставлю его и посмотрю, смогу ли я реализовать альтернативу с открытым исходным кодом позже. Кто-то предложил найденного здесь писателя lutzroeder.com/dotnet Я еще не смотрел источник, чтобы увидеть если он полагается на что-нибудь в фоновом режиме. - person PeteT; 21.03.2011
comment
Существует проект chromiumembedded и оболочка .NET CefSharp, который я успешно пробовал в качестве доказательства концепции в прошлом. Предостережения: а) В настоящее время находится только в альфа-версии, б) Webkit, похоже, имеет гораздо более сломанную реализацию редактора HTML, чем MSHTML. - person Uwe Keim; 21.03.2011

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

private void DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{

    IHTMLDocument2 Doc = Document.DomDocument as IHTMLDocument2;
    Doc.designMode = @"On";
}
person Prads    schedule 18.03.2011
comment
Спасибо, @Prads - В моих тестах он очищал содержимое при установке designMode на On. Может, я попробую еще раз. - person Uwe Keim; 19.03.2011

Вчера наконец-то был выпущен Internet Explorer 9 RTM.

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

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

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

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

Я надеюсь, что я могу ответить на свой вопрос и пометить свой ответ как «отвеченный»?!?

person Uwe Keim    schedule 16.03.2011

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

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

Всем спасибо!

person Michael Herchenroder    schedule 20.04.2011
comment
Вам нужно отредактировать существующий контент или просто получить пустой редактируемый элемент HTML? - person Uwe Keim; 21.04.2011

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

private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
    (((sender as WebBrowser).Document.DomDocument as IHTMLDocument2).body as HTMLBody).contentEditable = "true"; 
}
person user2015772    schedule 27.01.2013