WPF word-wrapping: пропущенные слова при использовании пользовательского шрифта - PullRequest
5 голосов
/ 30 марта 2011

Я использую пользовательский шрифт, известный как Pigiarniq в приложении WPF. Я обнаружил, что время от времени слова исчезают из TextBlocks, которые используют этот шрифт. Слова, которые исчезают, должны были появиться в конце строки, в которой они находятся, или, возможно, в следующей строке, что заставляет меня думать, что с переносом текста что-то не так. Я наконец (после многих трудностей) выделил проблему для небольшого фрагмента кода (ПРИМЕЧАНИЕ: это всего лишь тест для подтверждения возникновения проблемы. Это не является частью моей программы):

<Window x:Class="Test_the_textbox_width.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MainWindow" Height="350" Width="850">
<Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="Auto"/>
        <RowDefinition />
    </Grid.RowDefinitions>
    <Grid 
          HorizontalAlignment="Center">
    <TextBlock HorizontalAlignment="Left"
               Name="textBlock1"
               VerticalAlignment="Top"
               FontFamily="Pigiarniq%20Regular.ttf#Pigiarniq"
               TextWrapping="Wrap"
               FontSize="15"
               Margin="10">
        <TextBlock.Text>
             You do not need to enter both manually. Rates are calculated using true depositional 
            (uncompacted) thicknesses, rather than measured present-day thicknesses.
        </TextBlock.Text>
    </TextBlock>
    </Grid>

</Grid>

Слово «толщина», которое встречается после «(без уплотнения)», не появляется. Если я изменю размер окна вручную, используя дескриптор окна, оно появится снова.

ПРИМЕЧАНИЕ: я поместил TextBlock в элемент Grid выше, потому что иногда эта проблема возникает, когда TextBlock находится в Grid. В другом случае это было внутри InlineUIContainer. Были и другие случаи.

Я обнаружил, что такое поведение не происходит, если я устанавливаю ширину явно, например, если я подписываюсь на событие Loaded в TextBlock:

private void textBlock1_Loaded(object sender, RoutedEventArgs e)
    {
        textBlock1.Width = textBlock1.ActualWidth;
        //textBlock1.Width = Double.NaN;  //if you leave this in, you get the bad behaviour
    }

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

Ответы [ 2 ]

2 голосов
/ 03 апреля 2011

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

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

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

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

1 голос
/ 17 октября 2013

Мне удалось обойти это, установив TextAlignment = "Left" и HorizontalAlignment = "Stretch" в TextBlock.

...