Несогласованное сглаживание в WPF 3. 5

Я получаю странное поведение псевдонима в приложении WPF с использованием элемента управления ElementFlow FluidKit . Мы используем элемент управления в приложении на работе для представления контента, и когда элементы ElementFlow наклонены, псевдоним краев соответствует следующему изображению: Aliased edges

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

Однако в тестовом приложении с теми же настройками края красиво сглаживаются: Anti-aliased edges

Я предполагаю, что в иерархии XAML есть какие-то настройки, которые это контролируют, но я пробовал установить SnapsToDevicePixels для различных элементов и стилей, как во время разработки, так и во время выполнения (с привязками и инструментами как Snoop) безрезультатно.

XAML для ElementFlow выглядит следующим образом:


    
        
            
                
            
        
    

Я также пробовал оба приложения на двух разных машинах (на одном работает XP Pro, на другом XP Embedded, оба имеют разные уровни выделенной графики ), и оба демонстрируют сглаживание в одном приложении и сглаживание в другом.

Кто-нибудь знает какой-либо параметр или атрибут XAML, который можно использовать для управления этим?

9
задан Community 8 February 2017 в 14:29
поделиться

4 ответа

Если я правильно помню, в WPF 3.5 есть ошибка, связанная с псевдонимом в этом сценарии, я всю жизнь не могу найти соответствующую информацию, но, насколько я помню, это была прямая X флаг, который не был правильно установлен WPF.

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

Я полагаю, что различия, которые вы видите между приложениями, связаны с этим. В приложении, отображающем псевдонимы, элементы в ItemTemplate завернуты в какой-то родительский элемент (а в качестве тестового приложения они не являются)? Или наоборот?

Извините, я ничем не могу помочь, все еще ищу информацию, но мои возможности Google сегодня кажутся слабыми.

ОБНОВЛЕНИЕ: Хорошо, я нашел то, о чем думал.

http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/7382637b-b4bc-4a46-8bed-f36250a65385/

Это было связано с эффектами, так что, возможно, это не тот то же самое, что вы видите, но стоит попробовать.

1
ответ дан 5 December 2019 в 01:42
поделиться

Брендан Кларк из MSFT говорит:

Подобные ошибки возникают, когда вы пытаетесь рисовать контент в субпиксельных позициях. Если вы попытаетесь провести линию на граница полупикселя, WPF обычно сглаживать линию, чтобы смешать ее оба пикселя, содержащие его (которые делает его менее острым, светлее, или «размыто»). Если вы заставите рендеринг с псевдонимом, линии на субпикселе границы иногда заканчиваются полностью в пределах пикселя; в других случаях округление получится так, чтобы они исчезают.

Вы пытались установить разные значения для ElementHeight?

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

Следует учитывать расположение элемента управления ElementFlow. Если это аранжировка прямоугольника не на всем пикселе, это может отбросить все. SnapToDevicePixels не поможет с упорядочиванием прямоугольника.

Обычно это происходит, когда вы используете TextBlocks, поскольку их высота / ширина обычно не целые числа.

В .NET 4 есть новый FrameworkElement.UseLayoutRounding , который устраняет эту проблему.

1
ответ дан 5 December 2019 в 01:42
поделиться

Это обычная проблема WPF 3D. ElementFlow от FluidKit использует WPF 3D. Элементы в элементе управления являются фактическими 3D-объектами (Viewport3D, ContainerUIElement3D). Проблемы с субпиксельным рендерингом, LayoutRounding и SnapToDevicePixels не относятся к 3D-контенту. WPF возвращается к содержимому Viewport3D с псевдонимом, когда производительность не подходит. Таким образом, скорее всего, ваше проблемное приложение потребляет слишком много ресурсов (ЦП, графический процессор, память). Я убедился, что это происходит гораздо чаще под Windows XP, чем под Vista / Windows 7. Для Windows XP немного помогает установка ключа реестра сглаживания . Помимо этого и улучшения производительности вашего приложения, вы мало что можете с этим поделать.

1
ответ дан 5 December 2019 в 01:42
поделиться
Другие вопросы по тегам:

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