• Главная
  • Карта сайта
Не найдено

C # WebBrowser - такий простий і такий складний. Частина 1: HTML Editor / Microsoft User Group Community

  1. Працюємо з WebBrowser в Windows Forms додатках
  2. Створення HTML Editor
  3. Розширюємо функціонал HTML Editor
  4. Перехід на нову сторінку

Елемент управління WebBrowser дуже часто є хорошим варіантом для вирішення завдань, пов'язаних з Web Mining, відображенням і роботі з HTML даними. Незважаючи на гадану простоту роботи з цим елементом управління, існує багато проблем. На форумах дуже часто можна зустріти питання по роботі з WebBrowser, на деякі з найбільш поширених спробую відповісти, а також розповім про інших прийомах / трюках, з якими довелося зіткнутися.

Працюємо з WebBrowser в Windows Forms додатках

Створимо Windows Forms додаток, в яке додамо для початку елементи управління WebBrowser, Button і RichTextbox. Перше, що зробимо - це завантажимо якусь веб-сторінку за замовчуванням при запуску програми. Для цього в методі Form1_Load напишемо:

private void Form1_Load (object sender, EventArgs e) {webBrowser.Navigate ( "http://m.bing.com/"); }

Після чого отримаємо такий результат:

Шаблон проекту створено, приступимо до виконання деяких завдань.

Створення HTML Editor

Ми всі звикли до онлайн-редакторам HTML, але якщо нам необхідно зробити це в Windows Forms додатку? WebBroser може нам допомогти в цьому.

В першу чергу ми повинні додати в проект посилання на Microsoft.mshtml, після чого перепишемо наш код таким чином:

private void Form1_Load (object sender, EventArgs e) {InitWebBrowser (); } Private void InitWebBrowser () {string Encoding = "ISO-8859-1"; HtmlDocument hd; mshtml.IHTMLDocument2 axObj; webBrowser.DocumentText = ""; webBrowser.Document.Encoding = Encoding; hd = webBrowser.Document; axObj = hd.DomDocument as mshtml.IHTMLDocument2; axObj.designMode = "On"; webBrowser.Navigate ( "http://m.bing.com/"); }

C вигляд він здається дуже простим, але насправді кожен рядок тут має велике значення (коли довелося довго попотіти, щоб змусити цей код працювати). Спочатку ми створюємо змінні типу mshtml.IHTMLDocument2 і HtmlDocument. Далі присвоюємо властивості DocumentText пусте значення - якщо ми цього не зробимо, то на наступній сходинці ми отримаємо виняток NullReferenceException і сполученням "В екземплярі об'єкта не задане посилання на об'єкт". Насправді, ми не можемо працювати з властивістю webBrowser.Document до того, як воно не проініціалізіруется. Найпростіший спосіб - привласнити порожній рядок властивості DocumentText або написати щось типу webDrowser.Navigate ( "about: blank").

Потрібно ще відмітити, що багато властивостей WebBrowser є COM об'єктами, тобто по суті WebBrowser - це обгортка (wrapper) над старішим елементом управління AxSHDocVw.AxWebBrowser. Тому наступним етапом є приведення hd.DomElement до інтерфейсу mshtml.IHTMLDocument2. далі ми дісталися до самої суті - зміна режиму браузера за допомогою рядка axObj.designMode = "On";

Після цього наша сторінка буде редагованої (додамо рядок "Welcome from WebBrowser Demo!"):

Розглянемо як можна змінювати стилі в нашому HTML Editor.

Розширюємо функціонал HTML Editor

Зрозуміло, що в такому вигляді наш редактор нікому не потрібен, тому додамо йому трохи функціоналу.

Для цього нам необхідно розібратися, як можна керувати вмістом веб-браузера програмно. А зробити це можна за допомогою команди ExecCommand класу HtmlDocument, але для цього необхідно знати, які параметри необхідно передавати.

Розглянемо синтаксис методу execCommand, який приймає на вхід три аргументи:

  • ім'я команди: вказує на дії, які необхідно зробити з виділенням.
  • прапор: логічне значення, яке вказує чи відображати інтерфейс користувача, викликаний командою.
  • параметри команди

З цих трьох аргументів обов'язковим є тільки перший. приклад:

doc.execCommand ( "foreColor", false, "# FF0000");

Список команд:

Команда Опис 2D-Position Команда, що дозволяє користувачеві пересувати абсолютно позиційований елементи. AbsolutePosition Команда, що встановлює властивість position даного елемента в значення "absolute". BackColor Команда, що встановлює або повертає колір фону даного виділеного тексту. BlockDirLTR Чи не підтримується. BlockDirRTL Чи не підтримується. Bold Команда, що перемикає стан шрифту виділеного фрагмента тексту між жирним і нормальним. BrowseMode Чи не підтримується. Copy Команда, поміщає копію даного виділеного фрагмента тексту в буфер обміну. CreateBookmark Команда, яка створює "якір" з виділеного фрагмента тексту або повертає ім'я "якоря" для виділеного фрагмента тексту. CreateLink Команда, яка створює гіперпосилання з виділеного фрагмента тексту. Cut Команда, поміщає копію даного виділеного фрагмента тексту в буфер обміну і видаляє цей фрагмент з документа. Delete Команда, що видаляє виділений фрагмент тексту. DirLTR Чи не підтримується. DirRTL Чи не підтримується. EditMode Чи не підтримується. FontName Команда, що задає або повертає ім'я шрифту тексту. FontSize Команда, що задає або повертає розмір шрифту тексту ForeColor Команда, що задає або повертає колір тексту. FormatBlock Команда, форматує виділений фрагмент тексту як блок "DIV", "P" або "SPAN". Indent Команда, яка збільшує відступ виділеного фрагмента тексту. InlineDirLTR Чи не підтримується. InlineDirRTL Чи не підтримується. InsertButton Команда, вставляти в документ кнопку ( "BUTTON"). InsertFieldset Команда, вставляти в документ групу "FIELDSET". InsertHorizontalRule Команда, вставляти в документ горизонтальну смугу прокрутки. InsertIFrame Команда, вставляти в документ "плаваючий" фрейм. InsertImage Команда, вставляти в документ зображення. InsertInputButton Команда, вставляти в документ командну кнопку. InsertInputCheckbox Команда, вставляти в документ кнопку- "прапорець". InsertInputFileUpload Команда, вставляти в документ елемент управління для відправки файлу на сервер. InsertInputHidden Команда, вставляти в документ приховане поле. InsertInputImage Команда, вставляти в документ зображення як елемент управління. InsertInputPassword Команда, вставляти в документ поле введення пароля. InsertInputRadio Команда, вставляти в документ радіокнопку. InsertInputReset Команда, вставляти в документ кнопку скидання даних форми. InsertInputSubmit Команда, вставляти в документ кнопку відправки даних з форми на сервер. InsertInputText Команда, вставляти в документ поле введення тексту. InsertMarquee Комманда, вставляти в документ прокручується текст. InsertOrderedList Комманда, вставляти в документ нумерований список. InsertParagraph Комманда, що створює абзац з виділеного фрагмента тексту. InsertSelectDropdown Комманда, вставляти в документ, що випадає. InsertSelectListbox Комманда, вставляти в документ список. InsertTextArea Комманда, вставляти в документ область редагування тексту. InsertUnorderedList Комманда, вставляти в документ маркований список. Italic Комманда, що перемикає стан шрифту виділеного фрагмента тексту між похилим і нормальним. JustifyCenter Комманда, вирівнює абзац, в який входить фрагмент виділеного тексту, по центру. JustifyFull Чи не підтримується. JustifyLeft Комманда, вирівнює абзац, в який входить фрагмент виділеного тексту, по лівому краю. JustifyNone Чи не підтримується. JustifyRight Комманда, вирівнює абзац, в який входить фрагмент виділеного тексту, по правому краю. LiveResize Комманда, що включає або вимикає режим миттєвого ( "живого") відображення розмірів та місцезнаходження елементів сторінки під час зміни розмірів останньої. MultipleSelection Комманда, що дозволяє або забороняє виділення відразу декількох елементів web-СТРОНИЦІ. Open Чи не підтримується. Outdent Комманда, зменшує відступ виділеного фрагмента тексту. OverWrite Комманда, що перемикає режим введення тексту між вставкою і заміною. Paste Комманда, що замінює даний виділений фрагмент тексту на вміст буфера обміну. PlayImage Чи не підтримується. Print Комманда, що відкриває діалогове вікно "Друк". Redo Чи не підтримується. Refresh Комманда, перезавантажувати даний документ з сервера. RemoveFormat Комманда, що видаляє всі теги форматування тексту з виділеного фрагмента тексту. RemoveParaFormat Чи не підтримується. SaveAs Комманда, яка зберігає поточну web-сторінку в файл. SelectAll Комманда, що виділяє весь документ. SizeToControl Чи не підтримується. SizeToControlHeight Чи не підтримується. SizeToControlWidth Чи не підтримується. Stop Чи не підтримується. StopImage Чи не підтримується. StrikeThrough Чи не підтримується. Subscript Чи не підтримується. Superscript Чи не підтримується. UnBookmark Комманда, що видаляє елемент закладки з поточного фрагмента виділеного тексту. Underline Комманда, що встановлює підкреслення для виділеного фрагмента тексту або знімає це підкреслення. Undo Чи не підтримується. Unlink Комманда, що видаляє елемент гіперпосилання з поточного фрагмента виділеного тексту. Unselect Комманда, що очищає даний фрагмент виділеного тексту.

Додамо обробник події button1_Click і напишемо:

private void button1_Click (object sender, EventArgs e) {HtmlDocument doc = webBrowser.Document; doc.ExecCommand ( "Bold", false, null); }

При запуску програми ви можете виділити довільний текст і встановити стиль шрифту жирним шляхом натискання на нашу кнопку. Таким чином ви можете написати повноцінний HTML Editor, який буде підтримувати всі команди форматування.

Перехід на нову сторінку

І тут хочеться розповісти про ще одну особливість роботи з веб-браузером, на яку свого часу було витрачено дуже багато часу. Я говорю про ситуацію, коли вам необхідно перейти на інший веб-сайт або завантажити новий шаблон для редагування. Для демонстрації цієї ситуації перепишемо код button1_Click так, щоб перенаправляти браузер на іншу сторінку, наприклад на http://google.com/:

private void button1_Click (object sender, EventArgs e) {webBrowser.Navigate ( "http://google.com/"); }

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

Я обнишпорив весь інтернет у пошуках рішення, але відповіді не знайшов ні на одному з ресурсів, властивості типу ShowWarningPopup немає. В результаті рішення прийшло у вигляді такого трюку:

void ChangeAllowWebBrowserDrop () {webBrowser.AllowWebBrowserDrop =! webBrowser.AllowWebBrowserDrop; }

Ця функція змінювала властивість веб-браузера на протилежний, її потрібно викликати перед тим як здійснювати перехід на нову сторінку. Вся сіль в тому, що просте присвоєння true або false не допомагає, необхідно кожен раз міняти значення властивості на протилежний!

У наступних постах розглянемо інші особливості роботи з C # WebBrowser.

Провайдеры:
  • 08.09.2015

    Batyevka.NET предоставляет услуги доступа к сети Интернет на территории Соломенского района г. Киева.Наша миссия —... 
    Читать полностью

  • 08.09.2015
    IPNET

    Компания IPNET — это крупнейший оператор и технологический лидер на рынке телекоммуникаций Киева. Мы предоставляем... 
    Читать полностью

  • 08.09.2015
    Boryspil.Net

    Интернет-провайдер «Boryspil.net» начал свою работу в 2008 году и на данный момент является одним из крупнейших поставщиков... 
    Читать полностью

  • 08.09.2015
    4OKNET

    Наша компания работает в сфере телекоммуникационных услуг, а именно — предоставлении доступа в сеть интернет.Уже... 
    Читать полностью

  • 08.09.2015
    Телегруп

    ДП «Телегруп-Украина» – IT-компания с 15-летним опытом работы на рынке телекоммуникационных услуг, а также официальный... 
    Читать полностью

  • 08.09.2015
    Софтлинк

    Высокая скоростьМы являемся участником Украинского центра обмена трафиком (UA — IX) с включением 10 Гбит / сек... 
    Читать полностью