Подтвердить что ты не робот

Почему все в WPF размыто?

Может кто-нибудь объяснить, почему все в WPF размыто? Это что-то, что можно исправить?

4b9b3361

Ответ 1

Причиной этого является система сглаживания, которая расширяет линию на несколько пикселей, если она не выравнивается с пикселями физического устройства.

WPF не зависит от состояния. Это означает, что вы указываете размер элемента пользовательского интерфейса в дюймах, а не в пикселях. Логическая единица в WPF составляет 1/96 дюйма. Эта шкала выбрана, поскольку большинство экранов имеют разрешение 96 точек на дюйм. Таким образом, в большинстве случаев 1 логическая единица соответствует 1 физическому пикселю. Но если разрешение экрана меняется, это правило больше не действует.

Все элементы управления WPF предоставляют свойство SnapsToDevicePixels. Если установлено значение true, элемент управления гарантирует, что все ребра будут нарисованы на физических пикселях устройства. Но, к сожалению, эта функция доступна только на уровне управления.

Источник: Нарисовать строки на физических пикселях устройства

Ответ 2

Быстрое исправление:

Используйте эти параметры в каждом контейнере от root до вашего размытого элемента управления

        UseLayoutRounding="True"
        RenderOptions.BitmapScalingMode="NearestNeighbor"
        SnapsToDevicePixels="True"
        RenderOptions.ClearTypeHint="Enabled"

Пояснение:

UseLayoutRounding = true исправляет проблемы с подпиксельной компоновкой. Они часто возникают из-за того, что, например, Эффекты изменяют размеры элементов управления между пикселями.

RenderOptions.BitmapScalingMode = NearestNeighbor исправляет размытую выборку растровых изображений. Растровые изображения используются, когда используются эффекты или другие методы. Когда они будут повторно применены к контейнеру или управлению, они могут оказаться в промежутке между пикселями и, следовательно, интерполировать пиксели растрового изображения.

SnapsToDevicePixels = "True" фиксирует вертикальные и горизонтальные полигоны, линии и прямоугольники, отображаемые между пикселями

RenderOptions.ClearTypeHint = "Включено" повторно ссылается на текст cleartype. Он очень легко отключается с помощью эффектов или всякий раз, когда визуализатор не знает точный фон текста.

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

Ответ 3

Я потратил пару часов, пытаясь выяснить причину размытия на пользовательских панелях. На этих пользовательских панелях мы используем эффект границы тени. Тень была виновником. Это на самом деле вызывает размытый текст, если панели расположены рядом. У меня недостаточно высокая репутация, чтобы комментировать, поэтому я отвечаю на вопрос.

UseLayoutRounding="True"

был решением для моих проблем, как ответил ecreif. хотя мне не нужны были другие строки кода в его ответе, я все равно добавил их.