TextBlock размыто в WPF 3.5

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

Размытый текст

в результате чего я попробовал здесь в этом упрощенном примере:

<Window x:Class="WpfApplication1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <StackPanel>
            <TextBlock Text="StatusDTC [1]"></TextBlock>
            <TextBlock Text="StatusDTC [2]"
                       RenderOptions.BitmapScalingMode="NearestNeighbor"
                       RenderOptions.EdgeMode="Aliased"></TextBlock>
            <TextBlock Text="StatusDTC [3]" 
                       SnapsToDevicePixels="True"></TextBlock>
            <TextBlock Text="StatusDTC [4]"
                       SnapsToDevicePixels="True"
                       RenderOptions.BitmapScalingMode="NearestNeighbor"
                       RenderOptions.EdgeMode="Aliased"></TextBlock>
        </StackPanel>
    </Grid>
</Window>

Я нашел что-то подобное здесь. но UseLayoutRounding, кажется, не доступен для.Net 3.5. Я немного погуглил и обнаружил, что в.Net 4 (TextOptions.TextRenderingMode) есть улучшения, направленные на решение этой проблемы, но переход на.Net 4 с этим приложением невозможен.

Поскольку я знаю, что Win7 отображает WPF иначе, чем XP, я также запустил виртуальную XP и попробовал ее там. Результат тот же.

У кого-нибудь есть идея четкого текста в.Net 3.5?

3 ответа

Решение

Как объяснено в ссылке из ответа Амина, эта проблема в основном проявляется при небольших размерах шрифта.

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

Я не думаю, что если использовать растровый шрифт, вы можете сделать что-нибудь здесь.:(BitmapScalingMode не должно влиять на ваш текущий пример, если шрифт, который вы используете, основан на векторе, вам действительно нужны улучшения текста4.0

В Windows 7 рисование текста было переключено на DWrite, и поэтому оно отличается от XP.

Если обновление до.NET 4.0 абсолютно не подходит, есть еще один (немного отчаянный) вариант, который вы можете рассмотреть: получить что-то еще для визуализации текста. Например, вы можете использовать, скажем, GDI+, чтобы отобразить нужный текст в растровое изображение, а затем отобразить его. Или вы можете использовать взаимодействие для размещения элемента управления Windows Forms Label.

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

Так что, если бы я застрял в этой ситуации, я бы посмотрел на вариант рендеринга в растровое изображение. Можно использовать GDI + для создания растрового изображения, которое затем можно отобразить с помощью элемента изображения WPF. И если вы были готовы написать собственный элемент управления для этого, вы могли бы даже поддерживать такие вещи, как привязка данных (определяя свойство зависимости Text для текста, который вы отображаете). Хотя это не так просто - хотя существует общая точка зрения в отношении поддержки растровых изображений Windows, передача данных из мира GDI + в WIC (компоненты обработки изображений Windows, на которые WPF полагается при обработке растровых изображений) является... грязной. Кроме того, если вам нужно поддерживать доступность (например, сделать текст видимым для программ чтения с экрана, поддерживать мнемонические клавиши доступа и т. Д.), Это становится относительно сложным делом.

Другие вопросы по тегам