- •Лабораторная работа: Текст 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. Выборка текста из текстового файла с форматированием на лету
Упражнение 5. Преобразование html- в xaml-документ с записью в файл
Для больших документов преобразование на лету будет занимать время, да и все прелести WPF пользователь не увидит. Разумнее заранее подготовить документы в формате XAML, отредактировать их и уже готовыми подкачивать пользователю. В этом упражнении мы этим и займемся, для чего опять воспользуемся библиотекой HtmlConversion.dll.
Добавьте к решению новый проект WPF Application с именем WpfText5 и назначьте его стартовым
Добавьте к проекту ссылку на библиотеку HtmlConversion.dll
Дескрипторная часть проекта будет такой
<Window x:Class="WpfText5.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"
ResizeMode="CanResizeWithGrip"
>
<DockPanel Margin="3">
<StackPanel DockPanel.Dock="Bottom"
Orientation="Horizontal"
HorizontalAlignment="Center">
<Button Name="convertToXaml"
Width="85" Content="ConvertToXAML"
Click="convertToXaml_Click" />
<Button Name="loadXaml"
Width="85" Content="LoadXAML"
Margin="5,0,5,0"
Click="loadXaml_Click" />
<Button Name="editXaml"
Width="85"
Content="EditXAML"
Click="editXaml_Click" />
</StackPanel>
<FlowDocumentScrollViewer
x:Name="flowDocumentScrollViewer"
ScrollViewer.VerticalScrollBarVisibility="Visible"
Margin="0,0,0,3" >
<FlowDocument TextAlignment="Left">
<Paragraph TextAlignment="Center" FontWeight="Bold" FontSize="21">
Преобразование формата
</Paragraph>
<List MarkerStyle="Decimal" FontFamily="Arial" FontSize="14">
<ListItem>
<Paragraph>ConvertToXAML - выбрать HTML-файлы и
преобразовать в формат XAML
</Paragraph>
</ListItem>
<ListItem>
<Paragraph>LoadXAML - показать XAML-файл</Paragraph>
</ListItem>
<ListItem>
<Paragraph>EditXAML - редактировать файл в XAMLPad</Paragraph>
</ListItem>
</List>
</FlowDocument>
</FlowDocumentScrollViewer>
</DockPanel>
</Window>
На события Click кнопок подпишитесь вручную, чтобы оболочка правильно создала обработчики
Кодовая часть проекта будет такой
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.IO;
using Microsoft.Win32;
using HTMLConverter;
using System.Windows.Markup;
namespace WpfText5
{
public partial class Window1 : Window
{
OpenFileDialog openFileDialog = new OpenFileDialog();
public Window1()
{
InitializeComponent();
}
// При конвертации создается подкаталог FilesXAML относительно текущего
private void convertToXaml_Click(object sender, RoutedEventArgs e)
{
openFileDialog.Title = "Select HTML-files";
openFileDialog.Filter = "HTML Documents (*.htm; *.html)|*.htm;*.html";
openFileDialog.Multiselect = true;
if (openFileDialog.ShowDialog() == false || openFileDialog.FileName == String.Empty)
return;
if (!Directory.Exists("FilesXAML"))
Directory.CreateDirectory("FilesXAML");
string[] fileNames = openFileDialog.FileNames;
foreach (String fileName in fileNames)
{
FileStream htmlStream = new FileStream(fileName, FileMode.Open, FileAccess.Read);
StreamReader myStreamReader = new StreamReader(htmlStream,
Encoding.GetEncoding(1251));
// Убираем полный путь и расширение
String name = fileName.Substring(0, fileName.LastIndexOf('.'));
int start = name.LastIndexOf('\\');
start = start != -1 ? start + 1 : 0;
name = name.Substring(start);
// Конвертируем
try
{
File.WriteAllText("FilesXAML\\" + name + ".xaml",
HtmlToXamlConverter.ConvertHtmlToXaml(myStreamReader.ReadToEnd(), true),
Encoding.GetEncoding(1251));
}
catch (Exception exc)
{
MessageBox.Show(exc.Message);
}
finally
{
// Сохранили информацию и закрыли потоки
htmlStream.Close();
myStreamReader.Close();
}
}
}
private void loadXaml_Click(object sender, RoutedEventArgs e)
{
openFileDialog.Title = "Select XAML-file";
openFileDialog.Filter = "XAML Documents (*.xaml)|*.xaml";
openFileDialog.Multiselect = false;
if (openFileDialog.ShowDialog() == false || openFileDialog.FileName == String.Empty)
return;
String fileName = openFileDialog.FileName;
try
{
FileStream htmlStream = new FileStream(fileName, FileMode.Open, FileAccess.Read);
StreamReader myStreamReader = new StreamReader(htmlStream,
Encoding.GetEncoding(1251));
FlowDocument content = XamlReader.Parse(myStreamReader.ReadToEnd()) as FlowDocument;
flowDocumentScrollViewer.Document = content;
}
catch { }
// Поток закрывать нельзя, разорвется связь с отображением документа
}
private void editXaml_Click(object sender, RoutedEventArgs e)
{
openFileDialog.Title = "Choose a folder with a XamlPad.exe";
openFileDialog.Filter = "XamlPad.exe|XamlPad.exe";
openFileDialog.RestoreDirectory = false;
if (openFileDialog.ShowDialog() == false || !File.Exists("XamlPad.exe"))
return;
String pathXamlPad = System.IO.Path.Combine(
Directory.GetCurrentDirectory(), "XamlPad.exe");
openFileDialog.Title = "Select XAML-file";
openFileDialog.Filter = "XAML Documents (*.xaml)|*.xaml";
openFileDialog.Multiselect = false;
if (openFileDialog.ShowDialog() == false || openFileDialog.FileName == String.Empty)
return;
System.Diagnostics.Process exe = new System.Diagnostics.Process();
exe.StartInfo.FileName = pathXamlPad; //Имя файла для запуска
exe.StartInfo.Arguments = openFileDialog.FileName; //Аргументы
try
{
exe.Start();
}
catch { }
}
}
}
Разберитесь с кодом, испытайте приложение - в результате получился простой инструмент для преобразований HTML в XAML
Пара HTML -файлов с простой разметкой и готовых XAML -файлов приведена в каталоге Source, но вы можете попробовать конвертировать любой другой файл с не очень сложной HTML -разметкой.
Конечно, это не промышленная программа Microsoft Silverlight или Microsoft Expression Blend, но элементарные преобразования она выполняет. И самое главное, - мы теперь немножко знаем, как и для чего это делается. Посмотрите, как неуклюже выглядит XamlPad, который находится в прилагаемом каталоге Source. Не удивляйтесь, что кириллицу он не отбражает, зато латиницу отображает прекрасно. В нем нет загрузки файлов, их следует указывать как параметр при запуске.
