Опубликован: 05.08.2010 | Доступ: свободный | Студентов: 2009 / 47 | Оценка: 4.50 / 4.40 | Длительность: 60:26:00
Самостоятельная работа 10:

Текст WPF

Упражнение 2. Поддержка документов нефиксированного формата

Классы-упаковки содержимого нефиксированного формата

  • FlowDocumentReader
  • RichTextBox
  • FlowDocumentScrollViewer
  • FlowDocumentPageViewer

имеют дочерний элемент FlowDocument. В свою очередь, FlowDocument задает строгую модель содержимого для своего дочернего содержимого. Дочерние элементы верхнего уровня, содержащиеся в FlowDocument, должны быть производными от Block и называются блочными. Допустимыми дочерними элементами верхнего уровня в FlowDocument являются следующие блоки:

Блок Описание
Paragraph Содержит текст, возможно форматированный.
List Содержит списки разного типа (нумерованный, маркированный и т. д.).
Table Содержит таблицы, похожие на таблицы Microsoft Word или HTML.
BlockUIContainer Содержит различные элементы пользовательского интерфейса, становящиеся частью размещения.
Section Содержит группу прочих блоков. Разделы удобны для применения общих атрибутов к группам блоков, например, одни и те же атрибуты шрифта для нескольких абзацев.

Внутри блоков дополнительное форматирование текста обеспечивается элементами, которые называются внутристрочными элементами. К ним относятся

  • элемент Bold
  • элемент Italic
  • элемент LineBreak
  • элемент List
  • элемент ListItem
  • элемент Paragraph
  • элемент Run
  • элемент Section
  • элемент Span
  • элемент Underline

Внутристрочные элементы могут быть вложенными друг в друга внутри блока или вместе с родительским блоком вложены в другой блок.

Некоторые элементы могут дополнительно настраиваться, например, такими атрибутами, как

  • BreakPageBefore=True" - начать с новой страницы
  • FontSize="24" - размер шрифта
  • Typography.Variants="Superscript" - надстрочный
  • Typography.Variants="Subscript" - подстрочный
  • TextIndent="25" - отступ первой строки блока
  • TextIndent="-15" - выступ первой строки блока
  • Margin="20,0,0,0" - отступ блока слева
  • TextAlignment="Center" - текст посредине контейнера рендеринга (представления)
  • MarkerStyle="None" - тип маркера в элементе List

Использование FlowDocument с контейнером по умолчанию

Создание экземпляра класса FlowDocument автоматически запускает родительский контейнер FlowDocumentReader, который размещает содержимое и имеет стандартную панель управления документом.

  • Добавьте к решению новый проект WpfText2 типа WPF Application и назначьте его стартовым
  • В декларативный раздел XAML добавьте контейнер <TabControl> с вкладкой <TabItem Header="Text1">
  • Заполните файл Window1.xaml следующим кодом
<Window x:Class="WpfText2.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Background="LightGray"
    Title="Window1" MinHeight="300" MinWidth="300" Height="300" Width="300">
    
    <TabControl>
        <TabItem Header="Text1">
            <FlowDocument Background="White">
                <Paragraph TextAlignment="Center" FontWeight="Bold">
                    Потоковый 
                    <Span Foreground="Red"> документ</Span> 
                    <Italic>с разбивкой на страницы</Italic>
                </Paragraph>
                <List MarkerStyle="Decimal" FontFamily="Arial">
                    <ListItem>
                        <Paragraph>Первый элемент ListItem</Paragraph>
                    </ListItem>
                    <ListItem>
                        <Paragraph>Второй элемент ListItem</Paragraph>
                    </ListItem>
                    <ListItem>
                        <Paragraph>Третий элемент ListItem</Paragraph>
                    </ListItem>
                </List>
                <Paragraph FontSize="12">Класс FlowDocument поддерживает списки, определения  
                    <Bold>
                        <Span FontFamily="Comic Sans MS" FontSize="12" Foreground="Blue">
                            семейств шрифтов, цвет
                        </Span>
                    </Bold> размеры и стили.
                </Paragraph>
            </FlowDocument>
        </TabItem>
    </TabControl>
</Window>
  • Запустите приложение, поизменяйте размер окна и разберитесь с кодом

Результат будет таким


Использование контейнера RichTextBox

Оборачивание элемента FlowDocument в контейнер RichTextBox отключает панель навигации по тексту.

  • В контейнер <TabControl> добавьте вкладку <TabItem Header="Text2" Selector.IsSelected="True"> и заполните ее следующим кодом
<TabItem Header="Text2" Selector.IsSelected="True">
            <RichTextBox IsReadOnly="True" FontSize="21" >
                <FlowDocument Background="White">
                    <Paragraph TextAlignment="Center" FontWeight="Bold">
                        Потоковый
                        <Span Foreground="Red">документ</Span>
                        <Italic>обернут в RichTextBox</Italic>
                    </Paragraph>
                    <List MarkerStyle="LowerLatin"  FontFamily="Arial" FontSize="14">
                        <ListItem>
                            <Paragraph>Маркер LowerLatin</Paragraph>
                        </ListItem>
                        <ListItem>
                            <Paragraph>Второй элемент ListItem</Paragraph>
                        </ListItem>
                    </List>
                    <List MarkerStyle="Box"  FontFamily="Arial" FontSize="14">
                        <ListItem>
                            <Paragraph>Маркер Box</Paragraph>
                        </ListItem>
                        <ListItem>
                            <Paragraph>Второй элемент ListItem</Paragraph>
                        </ListItem>
                    </List>
                    <Paragraph FontSize="12">В родительском контейнере RichTextBox 
                        <Bold>
                            <Span FontFamily="Comic Sans MS" FontSize="12" Foreground="Blue">
                                включен режим IsReadOnly="True" 
                            </Span>
                        </Bold> и не появляется полоса прокрутки при длинном тексте
                    </Paragraph>
                </FlowDocument>
            </RichTextBox>
        </TabItem>

Присоединенный к дескриптору вкладки атрибут Selector.IsSelected="True" позиционирует ее при открытии окна.

  • Запустите приложение, поизменяйте размер окна и разберитесь с кодом

Результат будет таким


Использование контейнера FlowDocumentScrollViewer

Оборачивание элемента FlowDocument в контейнер FlowDocumentScrollViewer по умолчанию отключает панель инструментов документа и добавляет вертикальную панель прокрутки, которую можно настраивать. Вертикальная полоса прокрутки включается с помощью присоединенного свойства. Панель инструментов включается свойством IsToolBarVisible="True" (по умолчанию IsToolBarVisible="False" ).

FlowDocument - единственный допустимый дочерний элемент объекта FlowDocumentScrollViewer. В FlowDocumentScrollViewer может быть размещен не более чем один элемент FlowDocument.

  • В контейнер <TabControl> добавьте вкладку <TabItem Header="Text3"> и заполните ее следующим кодом
<TabItem Header="Text3">
            <FlowDocumentScrollViewer 
                ScrollViewer.VerticalScrollBarVisibility="Auto" 
                IsToolBarVisible="False"
                >
                <FlowDocument Background="White" FontSize="14">
                    <Paragraph TextAlignment="Center" FontWeight="Bold">
                        FlowDocument
                        <Italic>помещен в</Italic>
                        <Span Foreground="Red">FlowDocumentScrollViewer</Span>
                    </Paragraph>
                    <List MarkerStyle="None" FontFamily="Arial">
                        <ListItem>
                            <Paragraph>Буря мглою небо кроет</Paragraph>
                        </ListItem>
                        <ListItem>
                            <Paragraph>Вихри снежные крутя.</Paragraph>
                        </ListItem>
                        <ListItem>
                            <Paragraph>То как зверь она завоет</Paragraph>
                        </ListItem>
                        <ListItem>
                            <Paragraph>То заплачет как дитя.</Paragraph>
                        </ListItem>
                    </List>
                    <Paragraph TextAlignment="Left" FontSize="12">Текст 
                        нефикированного формата FlowDocument нужно заключать в параграфы 
                        (абзацы), внутри которых можно применять стилевые элементы.
                    </Paragraph>
                    <Paragraph>
                        <Bold>
                            <Span FontFamily="Comic Sans MS" FontSize="12" Foreground="Blue">
                                Буря мглою небо кроет вихри снежные крутя.
                                <LineBreak />
                            </Span>
                        </Bold>
                        То как зверь она завоет, то заплачет как дитя.
                    </Paragraph>
                </FlowDocument>
            </FlowDocumentScrollViewer>
        </TabItem>

Присоединенный к дескриптору <FlowDocumentScrollViewer> атрибут ScrollViewer.VerticalScrollBarVisibility="Auto" обеспечивает автоматическое появление полосы прокрутки, если текст не помещается на экране. Атрибуты, установленные в контейнере <FlowDocument>, действуют по умолчанию на все дочерние элементы, если аналогичные атрибуты в них не переопределены. В списках маркеры элементов можно менять или вообще отключать.

  • Запустите приложение, поизменяйте размер окна и разберитесь с кодом

Результат будет таким


Алексей Бабушкин
Алексей Бабушкин

При выполнении в лабораторной работе упражнения №1 , а именно при выполнении нижеследующего кода:

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Text;

using System.Windows.Forms;

using Microsoft.Xna.Framework.Graphics;

   

namespace Application1

{

    public partial class MainForm : Form

    {

        // Объявим поле графического устройства для видимости в методах

        GraphicsDevice device;

   

        public MainForm()

        {

            InitializeComponent();

   

            // Подпишемся на событие Load формы

            this.Load += new EventHandler(MainForm_Load);

   

            // Попишемся на событие FormClosed формы

            this.FormClosed += new FormClosedEventHandler(MainForm_FormClosed);

        }

   

        void MainForm_FormClosed(object sender, FormClosedEventArgs e)

        {

            //  Удаляем (освобождаем) устройство

            device.Dispose();

            // На всякий случай присваиваем ссылке на устройство значение null

            device = null;       

        }

   

        void MainForm_Load(object sender, EventArgs e)

        {

            // Создаем объект представления для настройки графического устройства

            PresentationParameters presentParams = new PresentationParameters();

            // Настраиваем объект представления через его свойства

            presentParams.IsFullScreen = false; // Включаем оконный режим

            presentParams.BackBufferCount = 1;  // Включаем задний буфер

                                                // для двойной буферизации

            // Переключение переднего и заднего буферов

            // должно осуществляться с максимальной эффективностью

            presentParams.SwapEffect = SwapEffect.Discard;

            // Устанавливаем размеры заднего буфера по клиентской области окна формы

            presentParams.BackBufferWidth = this.ClientSize.Width;

            presentParams.BackBufferHeight = this.ClientSize.Height;

   

            // Создадим графическое устройство с заданными настройками

            device = new GraphicsDevice(GraphicsAdapter.DefaultAdapter, DeviceType.Hardware,

                this.Handle, presentParams);

        }

   

        protected override void OnPaint(PaintEventArgs e)

        {

            device.Clear(Microsoft.Xna.Framework.Graphics.Color.CornflowerBlue);

   

            base.OnPaint(e);

        }

    }

}

Выбрасывается исключение:

Невозможно загрузить файл или сборку "Microsoft.Xna.Framework, Version=3.0.0.0, Culture=neutral, PublicKeyToken=6d5c3888ef60e27d" или один из зависимых от них компонентов. Не удается найти указанный файл.

Делаю все пунктуально. В чем может быть проблема?