
- •Лабораторная работа: Текст wpf Введение
- •Упражнение 1. Простые текстовые элементы
- •Создание заготовки решения
- •Элемент TextBlock с анимацией
- •Элемент TextBlock с текстурой символов
- •Автоматический перенос слов в TextBlock
- •Использование дополнительных шрифтов
- •Элементы TextBox и PasswordBox
- •Упражнение 2. Поддержка документов нефиксированного формата
- •Использование FlowDocument с контейнером по умолчанию
- •Использование контейнера RichTextBox
- •Использование контейнера FlowDocumentScrollViewer
- •Использование контейнера FlowDocumentPageViewer
- •Пример из msdn
- •Загрузка FlowDocument из xaml-файла
- •Упражнение 3. Работа в wpf с html-документами
- •Просмотр html-документов в WebBrowser
- •Отображение html-текста в WebBrowser из файла
- •Отображение html-текста в WebBrowser из потока
- •Еще один способ загрузки html-документа из потока
- •Упражнение 4. Преобразование html- в xaml-документ на лету
- •Упражнение 5. Преобразование html- в xaml-документ с записью в файл
- •Пражнение 6. Выборка текста из текстового файла с форматированием на лету
Еще один способ загрузки html-документа из потока
В декларативный раздел XAML в контейнер <TabControl> добавьте новую вкладку <TabItem Header="HTML4">
Заполните ее следующим скриптом
<TabItem Header="HTML4" Selector.IsSelected="True">
<WebBrowser x:Name="webBrowser4" Initialized="webBrowser4_Initialized" />
</TabItem>
Обработчик события Initialized заполните так
private void webBrowser4_Initialized(object sender, EventArgs e)
{
string path = System.IO.Directory.GetCurrentDirectory() + "\\HtmlDoc.htm";
System.IO.StreamReader streamReader = new System.IO.StreamReader(
path, Encoding.GetEncoding(1251));
//MessageBox.Show(streamReader.CurrentEncoding.CodePage.ToString());
string text = streamReader.ReadToEnd();
webBrowser4.NavigateToString(text);
}
Здесь мы задали номер кодовой страницы 1251 !!!
Обязательно закомментируйте или удалите HTML-дескриптор <meta> в документе HtmlDoc.htm, иначе будут проблемы с кодировкой "Кириллица (Windows) - 1251" в этом примере HTML4
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Untitled Document</title>
<!--
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
-->
</head>
<body style="font-family:Arial, Helvetica, sans-serif">
<h2 align="center"><font color="#FF0000">Это небольшой фрагмент чистого HTML-текста</font></h2>
<ol>
<li>Шрифт Arial</li>
<li><font color="#0000FF">Цвет font color="#0000FF"</font></li>
<li><font face="Courier New">Шрифт Courier New </font></li>
<li><b>Стиль полужирный <b> </b></li>
<li><i>Стиль Italic <i> </i></li>
</ol>
</body>
</html>
Запустите проект - получится то же самое, что в предыдущем примере
Упражнение 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.