WPF 3.5中的抗锯齿不一致

时间:2010-08-09 23:36:47

标签: .net wpf antialiasing

我在使用FluidKit's ElementFlow控件的WPF应用程序中获得了奇怪的别名行为。我们在工作中的应用程序中使用控件来呈现内容,并且当ElementFlow的元素倾斜时,边缘别名如下图所示: Aliased edges

为了避免混叠,我们决定摆脱倾斜角度,所以我创建了一个快速测试应用程序,我将倾斜角度,项目间隙和弹出距离限制在滑块上,这样我就可以找到看起来最好的

但是,在使用相同设置的测试应用中,边缘很好地消除锯齿: Anti-aliased edges

我假设XAML层次结构中的某个设置正在控制它,但我尝试在设计时和运行时设置SnapsToDevicePixels各种元素和样式(使用绑定和工具,如Snoop )无济于事。

ElementFlow的XAML如下:

<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 个答案:

答案 0 :(得分:1)

如果我没记错,在这种情况下WPF 3.5中存在关于别名的错误,我不能在我的生活中找到相关信息,但是从我记忆中它是一个没有设置的Direct X标志正确的WPF。

我记得我发现,如果你在某些类型的父元素中包装有问题的元素,它似乎解决了问题。例如,我认为在空边框中包装有问题的元素可以解决问题吗?再一次,我不能为我的生活再次找到信息,但如果我找到它,我会更新我的答案。

我认为您在应用程序之间看到的差异与此相关。在显示别名的应用程序中,ItemTemplate中的项目包含在某种父元素中(作为测试应用程序,它们不是)?反之亦然?

抱歉,我无法提供更多帮助,仍在寻找相关信息,但我的Google权力今天似乎很弱。

更新:好的我找到了我的想法。

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

这与效果有关,所以这可能与你看到的不一样但值得一试。

答案 1 :(得分:1)

要考虑的一件事是ElementFlow控件的位置。如果它的排列矩形不在整个像素上,那么可能会抛弃一切。 SnapToDevicePixels无法帮助安排rect。

这通常在您使用TextBlocks时发生,因为它们的高度/宽度通常不是整数。

在.NET 4中,有一个新的FrameworkElement.UseLayoutRounding解决了这个问题。

答案 2 :(得分:1)

这是WPF 3D的常见问题。 FluidKit的ElementFlow使用WPF 3D。控件中的项目是实际的3D对象(Viewport3D,ContainerUIElement3D)。子像素渲染问题,LayoutRounding和SnapToDevicePixels不适用于3D内容。当性能不合适时,WPF会恢复为别名的Viewport3D内容。所以大多数人都喜欢你的有问题的应用程序消耗太多的资源(CPU,GPU,内存)。我已经获得了在Windows XP下比在Vista / Windows 7下更频繁地发生这种情况的经验。对于Windows XP,它有助于设置antialiasing registry key。除此之外,并改善您的应用程序的性能,你可以做更多的事情。

答案 3 :(得分:0)

MSFT的Brendan Clark说:

  

当您尝试时会发生这样的错误   在子像素位置绘制内容。   如果你试图在a上画一条线   半像素边界,WPF通常会   反混淆线以将其混合   包含它的两个像素(哪个   导致它变得不那么尖锐,   打火机,或“模糊”)。如果你强迫   别名渲染,子像素上的线条   边界有时最终会被绘制出来   完全在一个像素内;其他时间   四舍五入将成功   他们消失了。

您是否尝试过为ElementHeight设置不同的值?