Wpf, підстановка і вбудовування шрифтів

підстановка шрифтів

При вказівці шрифтів слід акуратно підходити до вибору шрифту, який повинен бути присутнім на комп'ютері користувача. WPF може дещо допомогти в цьому питанні завдяки системі альтернативних шрифтів. Вона дозволяє вказати у властивості FontFamily список шрифтів, розділяючи їх комами. Після цього WPF спробує вибрати шрифт із заданого списку.

Наведений нижче приклад намагається використовувати шрифт Technical Italic, а в разі його відсутності будуть обраний запасний варіант - Comic Sans MS або Arial:

Якщо раптом сімейство шрифтів містить кому в своєму імені, її необхідно записати двічі.

Між іншим, є можливість отримати список всіх шрифтів, встановлених на поточному комп'ютері - за допомогою статичної колекції SystemFontFamilies з класу System.Windows.Media.Fonts. Нижче показаний приклад, в якому ця колекція використовується для додавання шрифтів в вікно списку:

Об'єкт FontFamily дозволяє дізнатися і інші деталі, такі як міжрядковий інтервал і родинні гарнітури.

Одним з інгредієнтів, відсутнім в WPF, є діалогове вікно для вибору шрифту. Група розробників WPF Text запропонувала два більш привабливих кошти для вибору шрифту: версію без коду, що використовує прив'язку даних і більш складну версію, яка підтримує необов'язкові оформлювальні можливості, що зустрічаються в деяких шрифтах ОреnType.

вбудовування шрифтів

Іншою можливістю при роботі з незвичайними шрифтами є їх вбудовування в додаток. Тоді у додатки ніколи не буде проблем з перебуванням необхідного шрифту.

Процес вбудовування дуже простий. Спочатку потрібно додати в додаток файл шрифту (як правило, з розширенням .ttf) і привласнити параметру Build Action значення Resource. (Це можна зробити в Visual Studio, вибравши файл шрифту в Solution Explorer і змінивши значення Build Action в вікні Properties (Властивості).)

Потім, при використанні шрифту, потрібно додати перед ім'ям сімейства символьну послідовність ./#:

Wpf, підстановка і вбудовування шрифтів

WPF інтерпретує символи ./ як вказівку на поточну папку. Щоб зрозуміти, що це означає, необхідно розібратися з системою упаковки XAML.

Можна запускати автономні (так звані незв'язані) XAML-файли прямо в браузері, що не компілюючи їх. Єдина умова полягає в тому, що XAML-файл не може використовувати файл відокремленого коду. Поточні папки допустимі, так що WPF шукає файли шрифтів, які знаходяться в одному каталозі з XAML-файлом, і робить їх доступними для додатка.

Цей URI доступний в декількох місцях, в тому числі і через властивість FontFamily.BaseUri. WPF використовує цей URI як базове місце розташування при пошуку шрифтів. Таким чином, при використанні синтаксису ./ в скомпільованому WPF-додатку буде виконуватися пошук шрифтів, які вбудовані у вигляді ресурсів разом з відкомпільоване XAML.

Після символів ./ можна просто вказати ім'я файлу, однак зазвичай додається знак номера (#) і ім'я сімейства шрифтів. У наведеному вище прикладі вбудований шрифт називається Vivaldi.

У встановленні шрифтів є свої тонкощі. Необхідно вказати точне ім'я сімейства шрифтів, а також вибрати коректне дію збірки для файлу шрифту. Вбудовування шрифтів зачіпає і питання, пов'язані з ліцензуванням. На жаль, більшість постачальників шрифтів дозволяють вбудовувати свої шрифти в документи (наприклад, в файли формату PDF), але не в додатки (наприклад, збірки WPF), навіть якщо вбудований шрифт WPF не є безпосередньо доступним для кінцевого користувача. WPF не намагається якось ліцензувати шрифти, і все ж перед тим як поширювати шрифт, переконайтеся в тому, що ви не порушуєте умови ліцензії.

Зокрема, подивіться на вкладці Embedding (Вбудовування), чи дозволено вбудовування цього шрифту. Шрифти, помічені як Installed Embedding Allowed (Дозволено інстальовані вбудовування), придатні для використання в WPF-додатках, а шрифти, помічені як Editable Embedding Allowed (Дозволено редагується вбудовування) можуть виявитися непридатними для цього. Інформацію про ліцензійному використанні будь-якого шрифту зверніться до свого постачальника цього шрифту.

Режим форматування тексту

Промальовування тексту в WPF трохи відрізняється від промальовування в старих додатках на основі GDI. В основному це відмінність обумовлена ​​застосуванням в WPF незалежної від пристрою системи відображення, але з'явилися також і значні удосконалення, які дозволяють тексту виглядати ясніше і чіткіше, особливо на РК-моніторах.

Однак промальовування тексту в WPF має і один відомий недолік. При дрібних розмірах шрифтів текст стає розмазаним і містить небажані артефакти (на кшталт кольорового ореолу навколо країв символів). Такі проблеми не виникають при виведенні тексту за допомогою GDI, тому що в цьому інтерфейсі використовується кілька прийомів, призначених для підвищення чіткості дрібного тексту.

Наприклад, GDI може змінювати форми дрібних букв, зрушувати їх позиції і вирівнювати по межах пікселів. Ці заходи призводять до втрати гарнітурами деяких особливостей, але вони підвищують зручність читання з екрану в разі відображення дрібного тексту.

А як же вирішити задачу відображення дрібного тексту в WPF? Краще просто збільшити його розмір (на моніторі з 96 dpi цей дефект зникає при розмірі тексту приблизно в 15 незалежних від пристрою одиниць) або використовувати монітор з великим значенням dpi, дозволу якого вистачить на відображення чіткого тексту необхідного розміру. Але оскільки ці варіанти часто незастосовні на практиці, в WPF 4 введена нова можливість: вибіркове застосування промальовування тексту в стилі GDI.

Для відображення тексту в стилі GDI потрібно додати до елементу, що відображає цей текст (наприклад, TextBlock або Label), прикріплене властивість TextOptions.TextFormattingMode і змінити його значення на Display (зі стандартного Ideal).

Врахуйте, що властивість TextFormattingMode годиться в якості рішення тільки для невеликого шрифту. Якщо застосовувати його для великих розмірів (більше 15 пунктів), то текст буде не таким чітким, проміжки між символами - не такими рівними, а самі символи будуть виглядати не дуже акуратними.

А якщо використовувати ще і перетворення, яке повертає, масштабує розмір або ще якось змінює вид тексту, то завжди слід застосовувати стандартний режим відображення тексту в WPF. Адже оптимізація в стилі GDI застосовується до тексту перед такими перетвореннями. А після виконання перетворення результат вже не буде вирівняний по межах пікселів, і текст буде виглядати розмитим.