Joe*_*ite 6 wpf tiles tesselation
我想在WPF中无缝平铺一堆不同颜色的矩形.也就是说,我希望将一堆矩形边对边放置,并且它们之间没有间隙.
如果所有内容都与像素对齐,这可以正常工作.但我也想支持任意缩放,理想情况下,我不想使用SnapsToDevicePixels(因为当图像缩小时会影响质量).但这意味着我的矩形有时会带有间隙.例如:
<Page xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Background="Black">
<Canvas SnapsToDevicePixels="False">
<Canvas.RenderTransform>
<ScaleTransform ScaleX="0.5" ScaleY="0.5"/>
</Canvas.RenderTransform>
<Rectangle Canvas.Left="25" Width="100" Height="100" Fill="#CFC"/>
<Rectangle Canvas.Left="125" Width="100" Height="100" Fill="#CCF"/>
</Canvas>
</Page>
Run Code Online (Sandbox Code Playgroud)
如果ScaleTransform的ScaleX为1,则矩形无缝地组合在一起.当它为0.5时,它们之间会出现深灰色条纹.我理解为什么 - 组合的半透明边缘像素不能组合成100%不透明.但我想要一种解决方法.
我总是可以让矩形重叠,但我不会总是事先知道它们将成为什么模式(这是一个最终将支持地图编辑器的游戏).此外,这会导致当周围的事情缩放的方式重叠区域的文物中(除非我做下叠部分,这是一个可怕的很多工作,而且还导致在角落的问题斜面切割的角度).
有没有什么方法可以将这些矩形组合成一个组合的"形状",在没有内部间隙的情况下渲染?我已经玩过GeometryDrawing,它正是这样做的,但后来我没有看到用不同颜色的画笔绘制每个RectangleGeometry的方法.
有没有其他方法可以在任意变换下无缝拼接形状,而不需要使用SnapsToDevicePixels?
您可以考虑使用指南(请参阅MSDN 上的 GuidelineSet)并覆盖矩形的 OnRender 方法,以便它们的边界与设备的像素边界对齐。WPF 使用准则来确定是否以及在何处捕捉绘图。
在内部,这正是 SnapsToDevicePixels 用来确保对象与设备像素对齐的方法,但是通过手动放置参考线,您将能够控制何时应用捕捉行为以及何时不应用捕捉行为(因此,当您的图像全部缩放时)当然,您可以避免绘制辅助线,或者仅在形状与其他形状相邻的位置绘制辅助线,并依靠 WPF 的抗锯齿功能来处理其余部分)。您也许可以使用附加属性来完成此操作,以便可以将其应用于任何元素,但如果您只需要这种行为的一种类型的元素(例如矩形),则可能不值得付出额外的努力。
微软似乎也意识到了这个问题 - WPF 4.0 预计将具有 Layout Rounding 功能,与 Silverlight 中的版本一样,当启用布局舍入时,它会在渲染过程中舍入非整数值。