Нашли ошибку или опечатку? Выделите текст и нажмите

Поменять цветовую

гамму сайта?

Поменять
Обновления сайта
и новые разделы

Рекомендовать в Google +1

Форматирование текста

189

В Silverlight есть привычный элемент управления Label, но здесь он используется не просто как надпись, а как мощное средство связывания данных. Для вывода надписей в Silverlight используется элемент TextBlock, являющийся довольно простым. Он содержит свойство Text, в котором хранится выводимая строка текста. Далее мы рассмотрим форматирование текстовых данных на примере использования этого элемента.

В классе Control доступны свойства шрифтов, влияющие на внешний вид текста на экране:

Свойства шрифтов, определенные в классе Control
Свойство Описание
FontFamily Имя шрифта или семейства шрифтов, применяемых для вывода текста. Приложение Silverlight выполняется на стороне клиента, поэтому выбор ограничен девятью шрифтами: Arial, Arial Black, Comic Sans MS, Courier New, Georgia, Lucida, Times New Roman, Trebuchet MS И Verdana. Однако, затратив дополнительное время, можно распространять пользовательские шрифты, упаковав их в сборку проекта
FontSize Размер шрифта в пикселях. В обычных приложениях Windows шрифты измеряются в пунктах (points). Один пункт равен 1/72 дюйма на стандартном мониторе; один пиксель равен приблизительно 1/96 дюйма. Следовательно, чтобы преобразовать размер шрифта Silverlight в пункты, нужно умножить его на 3/4. Например, значение FontSize, равное 20 пикселям, эквивалентно традиционному размеру 15 пунктов
FontStyle Начертание текста (обычный или курсивный), представленное объектом FontStyle. Предопределенные значения FontStyle можно извлечь из статических свойств класса FontStyles, поддерживающего значения Normal (Обычный) и Italic (Курсив). Если применить курсивное начертание к шрифту, не предоставляющему курсивный вариант, Silverlight просто наклонит буквы, однако таким образом создается лишь грубая аппроксимация курсивного начертания
FontWeight Жирность шрифта, представленный объектом FontWeight. Предопределенные значения FontWeight можно извлечь из статических свойств класса FontWeights. Наиболее часто используются значения Normal (Обычный) и Bold (Полужирный), однако доступны и другие значения: Heavy (Тяжелый), Light (Легкий), ExtraBold (Жирный) и т.п. Если вариант Bold не представлен в предопределенном шрифте, Silverlight увеличит толщину линий шрифта, имитируя полужирный шрифт
FontStretch Степень сжатия или растяжения символов, представленная объектом FontStretch. Предопределенные значения FontStretch можно извлечь из статических свойств класса FontStretches. Например, значение UltraCondenced приводит к сжатию букв до 50% от их нормальной ширины, а значение UltraExpanded - к растяжению до 200%. Сжатие и растяжение — это средство шрифтов TrueType, не поддерживаемое многими шрифтами. Встроенные шрифты Silverlight не поддерживают средства TrueType, поэтому свойство FontStretch применимо только при внедрении пользовательских шрифтов

Очевидно, наиболее важное свойство - FontFamily, фактически определяющее коллекцию связанных шрифтов. Например, значение Arial представляет семейство шрифтов Arial Regular, Arial Bold, Arial Italic и Arial Bold Italic.

При задании шрифта нужно привести его имя, как в приведенной ниже разметке:

 <TextBlock FontFamily="Times New Roman" FontSize="18" Text="Какой-то текст"/>

При задании шрифта сокращать имя нельзя. Например, нельзя ввести Times или Times New вместо Times New Roman. Вместо имени семейства и свойства FontWeight можно ввести полное имя шрифта:

<TextBlock FontFamily="Times New Roman Bold" FontSize="18" Text="Какой-то текст"/>

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

Стандартные шрифты

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

Встроенные шрифты Silverlight

Шрифт Lucida представлен двумя вариантами с немного разными именами. В Windows включен вариант Lucida Sans Unicode, а вариант LucidaGrande почти идентичен шрифту, включенному в Mac OS X. Чтобы эта технология была работоспособной, в свойство FontFamily можно включать список имен шрифтов, разделенных запятыми, и Silverlight применит первый поддерживаемый шрифт. По умолчанию в элементе TextBlock свойство FontFamily имеет значение Lucida Sans Unicode, Lucida Grande.

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

Внедрение шрифта

Если в приложении применяется нестандартный шрифт, он должен быть внедрен в сборку. Тогда приложение легко найдет и применит заданный шрифт.

Внедрить шрифт в приложение несложно. В первую очередь нужно добавить файл шрифта (обычно он имеет расширение .ttf) в приложение и присвоить свойству Build Action значение Resource. В программе Visual Studio для этого нужно выделить имя файла шрифта в окне Solution Explorer и отредактировать свойство Build Action в окне Properties.

Затем нужно присвоить свойству FontFamily значение в следующем формате:

имя_файла_шрифта#имя_шрифта

Например, если в файл шрифта VivaldiFont.ttf включен шрифт Vivaldi, то внедрить его в приложение можно с помощью следующей разметки:

<TextBlock FontFamily="VivaldiFont.ttf#Vivaldi" ...
Вывод внедренного шрифта

Подчеркивание

Чтобы добавить подчеркивание в любой шрифт, нужно присвоить свойству TextDecorations значение Underline:

<TextBlock TextDecorations="Underline">Подчеркнутый текст</TextBlock>

В WPF доступно несколько способов модификации текста, включая зачеркивание и проведение линии над текстом. Однако в Silverlight доступно только подчеркивание.

Чтобы подчеркнуть в блоке текста только одно слово, примените встроенный элемент, как описано в следующем разделе.

Форматирование фрагмента текстового блока

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

<TextBlock FontFamily="Georgia" FontSize="22">
            Тестовый <Run FontStyle="Italic" Foreground="LimeGreen">пример</Run>
            форматирования <Run FontFamily="Arial" FontSize="36" Foreground="DarkOrange">текста</Run>
</TextBlock>
Форматирование фрагментов текста

Объект Run поддерживает те же свойства, что и TextBlock, включая Foreground, TextDecorations, и пять свойств шрифта (FontFamily, Fontsize, FontStyle, FontWeight и FontStretch).

Технически объект Run не является "истинным" элементом. Это всего лишь класс встраивания. Платформа Silverlight предоставляет два класса встраивания: LineBreak и Run. В коде объекты Run, встроенные в элемент TextBlock, доступны посредством коллекции Inlines. Фактически весь текст можно определить не только с помощью свойства Text, но и посредством коллекции Inlines. Однако необходимо учитывать, что изменение свойства влияет на коллекцию, и наоборот.

Из всей огромной модели документов WPF в Silverlight перешли только классы встраивания Run и LineBreak.

Перенос текста

Чтобы задать перенос на следующую строку текста, не поместившегося на текущей строке, используется свойство TextWrapping. По умолчанию оно имеет значение NoWrap, в результате чего содержимое отсекается правой границей элемента. При значении Wrap содержимое переносится на следующую строку (естественно, если ширина элемента TextBlock ограничена, например, пропорциональной или фиксированной шириной ячейки контейнера Grid). При переносе элемент TextBlock разрывает строку на ближайшем пробеле. Если слово длиннее доступного пространства, элемент разрывает слово в произвольном месте (после последней поместившейся буквы).

При переносе текста учитываются значения свойств LineHeight и LineStackingStrategy. Свойство LineHeight может определять фиксированную высоту в пикселях, применяемую к каждой строке. Однако значение LineHeight может только увеличить высоту строки. Если оно задает меньшую высоту, чем необходимо, оно игнорируется.

Значение LineStackingStrategy определяет, что элемент текстового блока будет делать с многострочным содержимым, в котором используются разные шрифты. Значение MaxHeight задает стандартное поведение: каждая строка имеет высоту, достаточную для размещения символа, самого высокого в данной строке. При значении BlockLineHeight все строки имеют одинаковую высоту, заданную значением свойства LineHeight. Тогда над низким текстом получается свободное пространство, а высокий текст перекрывается соседней строкой. Разные варианты значений LineStackingStrategy показаны на рисунке ниже:

Два разных способа определения высоты строки

Элемент TextBlock задает обтекание прямоугольной области. С его помощью невозможно создать обтекание криволинейных контуров или фигур. Однако такой эффект можно имитировать с помощью обтекания RichTextBox.

Отсечение текста

Как было упомянуто выше, когда текст не помещается в контейнер по ширине, он может быть либо перенесен, либо отсечен. Например, при отсечении фраза "Silverlight — мощная платформа" может быть отображена так: "Silverlight — мощная пла".

Свойство TextTrimming позволяет отобразить отсеченную фразу более приемлемым способом. Если присвоить ему значение WordEllipsis (единственное, кроме значения по умолчанию), надстройка Silverlight при выводе отсеченного текста добавит в конец многоточие: "Silverlight — мощная пла...".

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

Промежутки между символами

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

<TextBlock FontSize="20" CharacterSpacing="100">
   Увеличены промежутки между символами по горизонтали. </TextBlock>

Размерность свойства CharacterSpacing — одна тысячная текущего размера шрифта. Например, если размер шрифта равен 20 пикселям, а свойству CharacterSpacing присвоено значение 100, то между каждыми двумя символами по горизонтали будет добавлено по два пикселя (100/1000 * 20 = 2).

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

Пройди тесты