2009-05-07 3 views
5

Я пишу приложение WPF и шрифт, который я использую только имеет проблемы, запущенные в WPF - он отлично работает, используя его в чем-либо еще (блокнот, текстовый блок и т. Д.). Проблема с WPF заключается в том, что он возвращается к другому шрифту иногда. Под «иногда» я имею в виду, что только символы [a-zA-Z] отображаются правильно, все остальное представляется в качестве шрифта TextBox по умолчанию.WPF Font: Почему некоторые символы отсутствуют?

Кто-нибудь знает, есть ли у WPF какие-то ограничения для шрифтов, которые он поддерживает? Похоже, что это ошибка в WPF - шрифт отлично работает везде.

Шрифт, который я пытаюсь использовать, это шрифт TTF «Scramble» (http://famousfonts.smackbomb.com/fonts/scrabble.php).

Номера и пробелы следует рассматривать как пустую плитку Scrabble/Scramble, но вместо этого сам номер появляется в текстовом поле, которое я использую.

код я использую:

<TextBox Text="Testing testing testing" FontFamily="Fonts/#Scramble" /> 

Кто-нибудь еще испытал что-то подобное?

Любые предложения будут качать!

Спасибо!

ответ

8

От MSDN:

шрифт Запасной

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

  • шрифт, который указан в клиентском приложении не существует в системе.
  • Шрифт, указанный клиентским приложением не содержит глифы, которые необходимы для визуализации текста.

В WPF, механизм резервного шрифта использует семейство шрифтов резервного варианта по умолчанию, «Global User Interface», как заменяющего шрифт. Этот шрифт определяется как как составной шрифт, имя файла которого : «GlobalUserInterface.CompositeFont». Для получения дополнительной информации о композитных шрифтах см. Раздел «Композитные шрифты» в этой теме.

Резервный механизм шрифта WPF заменяет предыдущие шрифты Win32 .

Мое предположение было бы, что шрифт не поддерживает Unicode - шрифт сам был создан в 1996 году, и с тех пор она предназначена для эмуляции Scrabble штук, я не уверен, что автор шрифта даже считается локализация.

EDIT Согласно документации шрифта, шрифт поддерживает буквы, и любое число должно оказывать пустую плитку. Пробелы не создают плитку.

+3

О, давай. У кого-то есть лучший ответ, чем этот ... Я бы смутился, чтобы получить щедрость за копирование/вставку из MSDN, которая даже не отвечает на вопрос ...: \ – GalacticCowboy

0

Я не в WPF, но я знаю, что Microsoft обрабатывает в целом латинские символы не латинского алфавита по-разному. Я видел, что вы можете определить составной шрифт и сопоставить определенный диапазон Unicode с шрифтом. Вы можете попытаться заставить свой шрифт для всего диапазона юникодов. link text

2

Вместо установки FontFaily = "Шрифты/# Scrambe", просто использовать имя шрифта без "Шрифты/#":

<TextBox Text="Testing testing testing" FontFamily="Scramble" /> 

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

3

Короткий ответ заключается в том, что Scramble не использует пустую кусочку scrabble для em-пространства в WPF или что-то еще. Вам понадобится другой шрифт или что-то, чтобы редактировать глифы em/en (что-то вроде Font Creator).

У меня есть another font (x-grid), который у меня KNOW имеет специальный глиф для пробелов и использовал их, как в коде ниже.

<Window x:Class="WpfApplication1.Window1" 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
Title="Window1" Height="300" Width="500"> 
<Grid> 
    <Grid.RowDefinitions> 
     <RowDefinition/> 
     <RowDefinition/> 
    </Grid.RowDefinitions> 
    <TextBlock Grid.Row="0" FontFamily="Scramble" TextAlignment="Center" HorizontalAlignment="Center" FontSize="24" Text="Example Text M M M"/> 
    <TextBlock Grid.Row="1" FontFamily="x-grid" TextAlignment="Center" HorizontalAlignment="Center" FontSize="24" Text="Example Text M M M"/> 
</Grid> 

В результате окно выглядит следующим образом. не

alt text http://i32.tinypic.com/4zw4dl.jpg

Ничего общего с шрифтом запасным вариантом, я боюсь. Извините, но я надеюсь, что это поможет.

** ОБНОВЛЕНИЕ: ** Извините, вы только что заметили, что вы упомянули номера тоже. Быстрый тест в Paint.Net показывает, что числа также не отображаются в плитках.

+0

Я попробовал это в Word, и номера первоначально не отображались, но если бы я вернулся и специально установил форматирование шрифта, то они появились. Но да, цифры немного глупые. Они также не отображаются в предварительном просмотре шрифтов. – GalacticCowboy

+0

Хмм, какое форматирование вы установили? В любом случае я попытаюсь получить более качественный шрифт, если он будет вести себя так flakely. – Stimul8d

+0

После того, как я ввел цифры, я их выбрал, а затем переключил шрифт на другое лицо, а затем вернулся к Scramble, и они появились. – GalacticCowboy

2

Типография в целом и шрифты, в частности, являются довольно сложной темой, на которой я действительно не вхожу. Это говорит вот что я понял из Typography in Windows Presentation Foundation и связанных с MSDN документации:

  • Текст визуализируется с помощью конвейера рендеринга текста (см ссылку выше для диаграммы).
  • WPF облегчает OpenType как расширение формата шрифта TrueType.
    • Объект Typography предоставляет множество дополнительных возможностей шрифтов OpenType.
  • Важной концепцией рендеринга нижнего уровня является элемент Glyphs, см. MSDN introduction.

Если вы посмотрите на указанную диаграмму конвейерной рендеринга, вы заметите, что в то время как глифы являются строительными блоками, они могут быть различными способами (отфильтрованы/преобразованы/...), прежде чем, наконец, конкретная среда, например экран или принтер; один пример будет применять ClearType для ЖК-экранов. Однако, как правило, с концепциями конвейерной обработки, эти преобразования являются более рудными, менее необязательными в целом.

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

<Page xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:sys="clr-namespace:System;assembly=mscorlib" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" > 
    <Grid> 
    <TextBox Text="TextBox: 1234567890" FontFamily="Scramble" FontSize="12" /> 
    <Glyphs UnicodeString="Glyphs: 1234567890" FontUri="C:\WINDOWS\Fonts\Scramble.TTF" 
      FontRenderingEmSize="12" Fill="Black" OriginX="5" OriginY="32"/> 
    </Grid> 
</Page> 

глифы элемента рендеринг пустых плиток для чисел, как требуется в то время как элемент TextBox не делает. Обратите внимание, что из-за того, что Glyphs является элементом низкого уровня, применяются несколько ограничений, особенно FontUri/Fill/FontRenderingEmSize, т. Е. Не существует значений по умолчанию, подобных связанным свойствам TextBox.

Учитывая это, вернемся к исходному вопросу: Я бы не подумал об этой проблеме как о ограничении WPF (или даже об ошибке), а о влиянии на требования к визуализации текста и значения по умолчанию, применяемые в контекст компоновки пользовательского интерфейса WPF. Например. составной (то есть не низкий уровень) TextBox элемент управления применяет форматирование текста и настройки типографии к его содержимому (глифы), облегчая различные таблицы отображения символов, встроенные в шрифты (есть потенциально lots из них ...); специальные/упрощенные шрифты, такие как Scramble, могут просто не предоставлять достаточную или правильную информацию здесь, следовательно, механизм рендеринга WPF может быть вынужден применить исправление шрифта как outlined by GalacticCowboy.

Если это действительно так, возможно, можно каким-либо образом переопределить алгоритм рендеринга по умолчанию WPF (см. Класс TextFormatter, текстовый движок WPF), но, вероятно, нужно было бы глубоко углубиться в структуру, чтобы выяснить, что происходит в пределах TextBox. Вероятно, гораздо проще «отлаживать» в конечном итоге отсутствующие или неправильные сопоставления символов внутри шрифта Scramble. Это было бы совсем другим делом, хотя ...

Смежные вопросы