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";
}