Упражнение 4. Преобразование HTML- в XAML-документ на лету

Мы долго изучали инструменты WPF для работы с текстом нефиксированного формата и даже рассмотрели загрузку XAML -документа из файла. Но реально такие документы тяжело получить: либо их нужно 'загонять' вручную в WPF -проект, либо заранее готовить в отдельном файле. Это большая работа и для ее выполнения требуются определенные знания по пройденному нами материалу, в частности, о внутристрочных элементах.

Для заблаговременной подготовки текста существует наипростейший редактор XamlPad, который поставляется вместе с оболочкой и его можно найти примерно в следующем месте компьютера (у меня так, как показано, но я его положил еще и в папку Source ):

C:\Program Files\Microsoft SDKs\Windows\v6.0A\bin\XamlPad.exe

Фактически этот редактор проверяет синтаксис XAML -документа и чуток визуализирует его, но никак не автоматизирует работу по созданию.

К счастью, в настоящее время появились более развитые редакторы, которые интегрируются в оболочку или используются отдельно. Это Silverlight и Expression Blend - оба от компании Microsoft и оба платные.

Очень часто обычных возможностей по форматированию текста, используемых в HTML -редакторах, вполне достаточно, особенно для больших документов. Поэтому было бы желательно уметь преобразовывать текст HTML в XAML -документ. Встроенных библиотечных классов для решения этой задачи пока нет, зато есть сторонняя библиотека, автор которой - David Waddleton (http://blogs.msdn.com/DavidWaddleton). Проект этой библиотеки можно свободно загрузить по адресу:

http://waddleton.net/Documents/HtmlConversion.zip

Архив HtmlConversion.zip с проектом и готовый файл HtmlConversion.dll библиотеки приведены в прилагаемом каталоге Source. В данном упражнении мы воспользуемся этой библиотекой 'вслепую', хотя никто не мешает познакомиться с исходным кодом, распаковав архив с проектом.

  • Добавьте к решению новый проект типа WPF Application с именем WpfText4 и назначьте его стартовым
  • Для узла References проекта вызовите контекстное меню, вызовите окно Add Reference одноименной командой и добавьте ссылку на библиотеку HtmlConversion.dll

 

  • В панели Solution Explorer раскройте узел проекта WpfText3 и перетаскиванием мышью скопируйте файл HtmlDoc.htm в корневой узел текущего проекта WpfText4
  • В панели Properties проверьте, сохранились ли свойства HtmlDoc.htm
    • Build Action = None
    • Copy to Output Directory=Copy if newer
  • Декларативный раздел XAML заполните следующим скриптом
<Window x:Class="WpfText4.Window1" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="Window1" Height="300" Width="300" MinHeight="300" MinWidth="300" > <FlowDocumentReader Name="flowDocumentReader" ViewingMode="Scroll" HorizontalContentAlignment="Left" IsPageViewEnabled="False" IsPrintEnabled="False" IsFindEnabled="False" IsScrollViewEnabled="True" IsTwoPageViewEnabled="False" Zoom="75" ScrollViewer.CanContentScroll="True" ScrollViewer.VerticalScrollBarVisibility="Disabled" ScrollViewer.HorizontalScrollBarVisibility="Disabled" Initialized="flowDocumentReader_Initialized" /></Window>
  • Кодовую часть заполните так
using System;using System.Collections.Generic;using System.Text;using System.Windows;using System.Windows.Controls;using System.Windows.Data;using System.Windows.Documents;using System.Windows.Input;using System.Windows.Media;using System.Windows.Media.Imaging;using System.Windows.Navigation;using System.Windows.Shapes; using System.Windows.Markup;using System.Xml;using System.IO;using HTMLConverter; namespace WpfText4{ public partial class Window1 : Window { public Window1() { InitializeComponent(); } private void flowDocumentReader_Initialized(object sender, EventArgs e) { string path = Directory.GetCurrentDirectory() + "\\HtmlDoc.htm"; StreamReader streamReader = new StreamReader( path, Encoding.GetEncoding("windows-1251")); //MessageBox.Show(streamReader.CurrentEncoding.EncodingName); string text = streamReader.ReadToEnd(); flowDocumentReader.Document = ConvertTextToFlowDocument(text); } public static FlowDocument ConvertTextToFlowDocument(string text) { try { string xaml = HTMLConverter.HtmlToXamlConverter.ConvertHtmlToXaml(text, true); return XamlReader.Load(new XmlTextReader(new StringReader(xaml))) as FlowDocument; } catch (Exception) { return null; } } }}

Здесь мы задали имя кодовой страницы "windows-1251" !!!

  • Запустите проект - получится почти то же самое, что в предыдущем упражнении

 

Хоть мы и не видели самого XAML -документа, но трудно отрицать, что в основном он сформирован верно - вся разметка текста практически сохранилась. Для данного примера мы произвольно применили элемент FlowDocumentReader, хотя могли выбрать любой другой из ранее рассмотренных контейнеров.

Обратите внимание, что для FlowDocumentReader установлено много декларативных настроек. Стоит с ними поэкспериментировать, чтобы узнать получше, поскольку эти настройки имеются у всех контейнеров документов нефиксированного формата FlowDocument.








Дата добавления: 2015-04-15; просмотров: 963;


Поиск по сайту:

При помощи поиска вы сможете найти нужную вам информацию.

Поделитесь с друзьями:

Если вам перенёс пользу информационный материал, или помог в учебе – поделитесь этим сайтом с друзьями и знакомыми.
helpiks.org - Хелпикс.Орг - 2014-2024 год. Материал сайта представляется для ознакомительного и учебного использования. | Поддержка
Генерация страницы за: 0.004 сек.