Несовместимый сглаживание в WPF 3.5 - PullRequest
9 голосов
/ 10 августа 2010

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

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

Однако в тестовом приложении, использующем те же настройки, края хорошо сглаживаются: Anti-aliased edges

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

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

<ListView.ItemsPanel>
    <ItemsPanelTemplate>
        <Fluid:ElementFlow
            x:Name="ContentElementFlow"
            SelectedIndex="{Binding SelectedIndex}"
            Focusable="True"
            TiltAngle="15.95"
            ItemGap="0.722"
            FrontItemGap="0.052"
            PopoutDistance="1.631"
            HasReflection="False"
            Background="Transparent"
            CurrentView="{StaticResource CoverFlowView}"
            ElementWidth="175"
            ElementHeight="250"
            >
            <Fluid:ElementFlow.Camera>
                <PerspectiveCamera
                    FieldOfView="60"
                    Position="0,0,6"
                    LookDirection="0,0,-6"
                    UpDirection="0,1,0"
                    />
            </Fluid:ElementFlow.Camera>
        </Fluid:ElementFlow>
    </ItemsPanelTemplate>
</ListView.ItemsPanel>

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

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

Ответы [ 4 ]

1 голос
/ 21 августа 2010

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

1 голос
/ 19 августа 2010

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

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

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

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

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

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

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

1 голос
/ 20 августа 2010

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

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

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

0 голосов
/ 18 августа 2010

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

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

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

...