Шрифт WPF: Почему некоторые символы отсутствуют?

Как насчет этого: Поймайте очень общее исключение, удостоверьтесь, что оно делает его из блока выгоды, затем утверждайте, что класс исключения - то, чем Вы ожидаете, что он будет. Это утверждает, перестанет работать если a) исключение имеет неправильный тип (например, если Вы получили Нулевого указателя вместо этого), и b) исключение никогда не выдавалось.

public void testFooThrowsIndexOutOfBoundsException() {
  Throwable e = null;

  try {
    foo.doStuff();
  } catch (Throwable ex) {
    e = ex;
  }

  assertTrue(e instanceof IndexOutOfBoundsException);
}
5
задан Charles 6 July 2009 в 16:15
поделиться

5 ответов

From MSDN :

Резервный шрифт

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

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

В WPF механизм отката шрифтов использует семейство запасных шрифтов по умолчанию, «Глобальный пользовательский интерфейс», как заменить шрифт. Этот шрифт определен как составной шрифт, имя файла которого является «GlobalUserInterface.CompositeFont». Для получения дополнительной информации о композитном шрифты, см. раздел Составные шрифты в этой теме.

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

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

РЕДАКТИРОВАТЬ Согласно документации шрифта, шрифт поддерживает буквы, и любое число должно отображать пустую плитку. Пробелы не отображают плитку.

8
ответ дан 18 December 2019 в 12:01
поделиться

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

0
ответ дан 18 December 2019 в 12:01
поделиться

The short answer is that Scramble doesn't use a blank scrabble piece for an em space in WPF or anything else. You'll need another font or something to edit the em/en space glyphs (something like Font Creator).

I got another font (x-grid) which i KNOW has a special glyph for spaces and used them as in the code below.

<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>

The resulting window looked like this.

alt text

Nothing to do with font-fallback I'm afraid. Sorry, but I hope that helps.

**UPDATE:**Sorry, just noticed you mentioned numbers too. A quick test in Paint.Net shows that numbers don't appear in tiles either.

3
ответ дан 18 December 2019 в 12:01
поделиться

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

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

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

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

<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>

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

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

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

2
ответ дан 18 December 2019 в 12:01
поделиться

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

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

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

2
ответ дан 18 December 2019 в 12:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: