我在使用FluidKit's ElementFlow控件的WPF应用程序中获得了奇怪的别名行为。我们在工作中的应用程序中使用控件来呈现内容,并且当ElementFlow的元素倾斜时,边缘别名如下图所示:
为了避免混叠,我们决定摆脱倾斜角度,所以我创建了一个快速测试应用程序,我将倾斜角度,项目间隙和弹出距离限制在滑块上,这样我就可以找到看起来最好的
但是,在使用相同设置的测试应用中,边缘很好地消除锯齿:
我假设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属性?
答案 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设置不同的值?