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

Текст WPF

Аннотация: Продолжая обучение технологии WPF, в этой лабораторной работе рассказывается об основных принципах, приемах и особенностях работы с текстом с помощью стандартных элементов WPF.

Все необходимые для выполнения данной работы программы можно найти в прилагаемом каталоге.

При изучении любого средства программирования используют примеры, которые иллюстрируют применение этого средства. Различают примеры двух видов:

  1. Примеры технологий - иллюстрируют отдельные стороны рассматриваемой технологии программирования
  2. Примеры приложений - иллюстрируют программирование предметной области с применением рассматриваемой технологии

В наших упражнениях рассматриваются преимущественно примеры технологий.

Введение

Текст и рисунки - главные информационные составляющие любого приложения. WPF имеет все стандартные элементы, необходимые для работы с текстом. Для простых случаев используются упрощенные элементы представления текста

  1. Label - метка
  2. TextBlock - текстовый блок
  3. TextBox - текстовое поле
  4. PasswordBox - поле пароля

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

  1. Документы фиксированного формата
  2. Документы нефиксированного формата

Документы фиксированного формата предназначены для приложений, требующих точного представления в режиме WYSIWYG (режим точного отображения - 'что вижу то и имею'), независимо от используемого дисплея или принтера. Документы фиксированного формата обычно используются при подготовке публикаций с помощью настольных издательских средств, обработке текста и разметке формы, где строгое соблюдение исходного дизайна страницы является обязательным. Содержимое документов фиксированного формата поддерживается классом FixedDocument, а для просмотра используется класс DocumentViewer.

Документы фиксированного формата, как часть макета, поддерживает точное позиционирование содержимого элементов, независимо от используемых устройств отображения или печати. Например, страница формата фиксированного документа, просматриваемая на экране с разрешением 96 точек на дюйм, будет отображаться точно так же на выводе лазерного принтера с разрешением 600 точек на дюйм или устройстве фотовывода с разрешением 4800 точек на дюйм. Макет страницы остается неизменным во всех случаях, в то время как качество документа повышается в соответствии с возможностями каждого устройства.

Документы нефиксированного формата предназначены для оптимизации просмотра и удобочитаемости и наиболее удобны в использовании, когда простота чтения является основным требованием сценария документа. Вместо предварительно определенного макета, документы нефиксированного формата динамически изменяют и переформатируют свое содержимое на основе переменных времени выполнения, таких как размер окна и разрешение устройства, и дополнительных пользовательских настроек.

В зависимости от среды выполнения, документы нефиксированного формата оптимизируют просмотр и чтение для пользователя. Например, один тот же документ нефиксированного формата будет динамически переформатирован для оптимальной удобочитаемости как на 19-дюймовом экране с высоким разрешением, так и на небольшом 2x3-дюймовом экране карманного ПК. Кроме того, документы нефиксированного формата имеют множество встроенных возможностей, включая поиск, просмотр режимов оптимизации удобочитаемости и возможность изменения размера и вида шрифтов.

Документы нефиксированного формата представлены классом содержимого FlowDocument. Этот класс обеспечивает размещение и форматирование содержимого потока с такими дополнительными свойствами документов, как разбивка на страницы и столбцы. Для отображения, редактирования и навигации по документу используются классы-контейнеры

  1. RichTextBox - текстовое поле с расширенными возможностями
  2. FlowDocumentScrollViewer - текстовый блок с расширенным содержимым и управляемой полосой прокрутки
  3. FlowDocumentPageViewer - дает возможность просматривать документ постранично и имеет привычные навигационные элементы
  4. FlowDocumentReader - элемент управления, в котором пользователь сам вибирает способ просмотра документа: одностраничный, многостраничный или с прокруткой

Любой из этих классов может иметь только один элемент содержимого FlowDocument, который адресуется их свойством Document. Если содержимое не загружено в контейнер отображения, то свойство Document имеет значение null.

В данной лабораторной работе рассматриваются средства WPF для представления текста нефиксированного формата.

Упражнение 1. Простые текстовые элементы

Текстовые элементы Label, TextBlock, TextBox, PasswordBox обычно используются для создания небольшого текста в интерфейсе пользователя. Они обладают достаточными для этого возможностями. Но отображать большие потоки текста они непредназначены.

Создание заготовки решения

  • Создайте решение WpfApp с проектом WpfText1 и назначьте его стартовым

  • Добавьте к проекту новый файл с именем FontPropertyLists.cs

Текстовый элемент Label

  • Заполните файл FontPropertyLists.cs следующим кодом
using System;
using System.Collections;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Windows;
using System.Windows.Media;
    
namespace WpfText1
{
    /// <summary>
    /// Код класса из примера MSDN
    /// </summary>
    public class FontPropertyLists
    {
        static Collection<FontFamily> fontFaces;
        static Collection<FontStyle> fontStyles;
        static Collection<FontWeight> fontWeights;
        static Collection<double> fontSizes;
        static int maxFontSizes = 36;

        /// <summary>
        /// Заполняет коллекцию доступных системе FontFamily
        /// </summary>
        public static ICollection<FontFamily> FontFaces
        {
            get
            {
                if (fontFaces == null) fontFaces = new Collection<FontFamily>();
                foreach (FontFamily fontFamily in Fonts.SystemFontFamilies)
                {
                    fontFaces.Add(fontFamily);
                }
                return fontFaces;
            }
        }
    
        /// <summary>
        /// Заполняет коллекцию доступных FontStyles  
        /// </summary>
        public static ICollection FontStyles
        {
            get
            {
                if (fontStyles == null)
                {
                    fontStyles = new Collection<FontStyle>();
                    fontStyles.Add(System.Windows.FontStyles.Normal);
                    fontStyles.Add(System.Windows.FontStyles.Oblique);
                    fontStyles.Add(System.Windows.FontStyles.Italic);
                }
                return fontStyles;
            }
        }
    
        /// <summary>
        /// Заполняет коллекцию доступных FontWeight
        /// </summary>
        public static ICollection FontWeights
        {
            get
            {
                if (fontWeights == null)
                {
                    fontWeights = new Collection<FontWeight>();
    
                    Unique(System.Windows.FontWeights.Thin);
                    Unique(System.Windows.FontWeights.Light);
                    Unique(System.Windows.FontWeights.Regular);
                    Unique(System.Windows.FontWeights.Normal);
                    Unique(System.Windows.FontWeights.Medium);
                    Unique(System.Windows.FontWeights.Heavy);
                    Unique(System.Windows.FontWeights.SemiBold);
                    Unique(System.Windows.FontWeights.DemiBold);
                    Unique(System.Windows.FontWeights.Bold);
                    Unique(System.Windows.FontWeights.Black);
                    Unique(System.Windows.FontWeights.ExtraLight);
                    Unique(System.Windows.FontWeights.ExtraBold);
                    Unique(System.Windows.FontWeights.ExtraBlack);
                    Unique(System.Windows.FontWeights.UltraLight);
                    Unique(System.Windows.FontWeights.UltraBold);
                    Unique(System.Windows.FontWeights.UltraBlack);
                }
                return fontWeights;
            }
        }
    
        static void Unique(FontWeight fontWeight)
        {
            if (fontWeights.IndexOf(fontWeight) == -1)
                fontWeights.Add(fontWeight);
        }
    
        /// <summary>
        /// Заполняет коллекцию доступных FontSizes 
        /// </summary>
        public static Collection<double> FontSizes
        {
            get
            {
                if (fontSizes == null)
                {
                    fontSizes = new Collection<double>();
                    for (double i = 8; i <= maxFontSizes; i++) fontSizes.Add(i);
                }
                return fontSizes;
            }
        }
    
        // Методы для преобразования из TypeName в Type
        public static bool CanParseFontStyle(string fontStyleName)
        {
            try
            {
                FontStyleConverter converter = new FontStyleConverter();
                converter.ConvertFromString(fontStyleName);
                return true;
            }
            catch
            {
                return false;
            }
        }
        public static FontStyle ParseFontStyle(string fontStyleName)
        {
            FontStyleConverter converter = new FontStyleConverter();
            return (FontStyle)converter.ConvertFromString(fontStyleName);
        }
        public static bool CanParseFontWeight(string fontWeightName)
        {
            try
            {
                FontWeightConverter converter = new FontWeightConverter();
                converter.ConvertFromString(fontWeightName);
                return true;
            }
            catch
            {
                return false;
            }
        }
        public static FontWeight ParseFontWeight(string fontWeightName)
        {
            FontWeightConverter converter = new FontWeightConverter();
            return (FontWeight)converter.ConvertFromString(fontWeightName);
        }
    }
}
  • Заполните файл Window1.xaml следующей разметкой
<Window x:Class="WpfText1.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="Window1" 
    Background="LightGray"
    Height="300"
    Width="300"
    MinHeight="300"
    MinWidth="300"
    ResizeMode="CanResizeWithGrip"
    WindowStartupLocation="CenterScreen"
    FocusManager.FocusedElement="{Binding ElementName='fontSizeListBox'}"        
        >
    <TabControl>
        <!--Вкладка Label-->
        <TabItem Header="Label">
            <!--Сетка 4x3-->
            <Grid>
                <Grid.RowDefinitions>
                    <RowDefinition Height="60" />
                    <RowDefinition Height="Auto" />
                    <RowDefinition Height="Auto" />
                    <RowDefinition Height="*" />
                </Grid.RowDefinitions>
                <Grid.ColumnDefinitions>
                    <!--Пропорции ширины столбцов-->
                    <ColumnDefinition Width="2.7*" />
                    <ColumnDefinition Width="1.3*" />
                    <ColumnDefinition Width="1*" />
                </Grid.ColumnDefinitions>
                <Border 
                    Grid.Row="0" Grid.ColumnSpan="3"
                    BorderThickness="3"
                    BorderBrush="Violet"
                    >
                    <Label
                        VerticalContentAlignment="Center" 
                        HorizontalContentAlignment="Center"
                        Foreground="Red"
                        FontWeight="{Binding ElementName=fontWeightListBox, Path=SelectedItem}"
                        FontSize="{Binding ElementName=fontSizeListBox, Path=SelectedItem}"
                        FontFamily="{Binding ElementName=fontFamilyListBox, Path=SelectedItem}"
                        Content="Элемент Label" 
                        />
                </Border>
                <Label
                    Grid.Row="1" Grid.Column="0" 
                    HorizontalContentAlignment="Center"
                    Content="FontFamily:" 
                    />
                <TextBox 
                    Grid.Row="2" Grid.Column="0"
                    Name="fontFamilyTextBox" 
                    Text="{Binding ElementName=fontFamilyListBox, Path=SelectedItem}" 
                    TextChanged="fontFamilyTextBox_TextChanged" 
                    />
                <ListBox 
                    Grid.Row="3" Grid.Column="0" 
                    Name="fontFamilyListBox" SelectedIndex="0" 
                    />
                <Label
                    Grid.Row="1" Grid.Column="1" 
                    HorizontalContentAlignment="Center"
                    Content="FontWeight:" 
                    />
                <TextBox 
                    Grid.Row="2" Grid.Column="1" 
                    Name="fontWeightTextBox" 
                    Text="{Binding ElementName=fontWeightListBox, Path=SelectedItem}" 
                    TextChanged="fontWeightTextBox_TextChanged" 
                    />
                <ListBox 
                    Grid.Row="3" Grid.Column="1" 
                    Name="fontWeightListBox" SelectedIndex="0" 
                    />
                <Label 
                    Grid.Row="1" Grid.Column="2" 
                    HorizontalContentAlignment="Center"
                    Content="FontSize:" 
                    />
                <TextBox 
                    Grid.Row="2" Grid.Column="2" 
                    Name="fontSizeTextBox" 
                    Text="{Binding ElementName=fontSizeListBox, Path=SelectedItem}" 
                    TextChanged="fontSizeTextBox_TextChanged" 
                    />
                <ListBox 
                    Grid.Row="3" Grid.Column="2" 
                    Name="fontSizeListBox" SelectedIndex="0" 
                    />
            </Grid>
        </TabItem>
    </TabControl>
</Window>
Алексей Бабушкин
Алексей Бабушкин

При выполнении в лабораторной работе упражнения №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" или один из зависимых от них компонентов. Не удается найти указанный файл.

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