2009-06-07 76 views
6

我想在WPF中无缝地平铺一堆不同颜色的矩形。也就是说,我想把一堆矩形边对边放,而且它们之间没有空隙。在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> 

如果ScaleTransform的的ScaleX是1,则该矩形装配在一起无缝连接。当它为0.5时,它们之间有一条暗灰色的条纹。我明白为什么 - 组合的半透明边缘像素不会100%不透明。但我想要一个方法来解决它。

我总是可以让矩形重叠,但我不会总是事先知道他们将会在什么样的模式下(这是为了最终支持地图编辑器的游戏)。此外,当物体被放大时,这会在重叠区域造成伪影(除非我在重叠部分做了斜切角度,这是一项非常多的工作,并且仍然在拐角处导致问题)。

有没有什么办法可以将这些矩形组合成一个组合的“形状”,它没有内部间隙?我玩过GeometryDrawing,它完全是这样,但是我没有看到用不同颜色的笔刷绘制每个RectangleGeometry的方法。

是否有任何其他方法可以在任意变换下无缝地平铺形状,而不诉诸于SnapsToDevicePixels?

+0

由于我有完全相同的问题,我想问你是否找到了解决方案。 – Jens 2010-05-27 10:52:31

回答

2

您可能会考虑使用指南(请参阅GuidelineSet on MSDN)并覆盖矩形的OnRender方法,以使它们的边界与设备的像素边界对齐。 WPF使用准则来确定是否以及在哪里捕捉图纸。

在内部,SnapsToDevicePixels正在使用它来确保对象与设备的像素对齐,但通过手动放置指引,您将能够控制何时应用捕捉行为以及何时不捕捉行为(因此,当您图像是放大的一切,你可以避免绘图准则,或只绘制形状与其他形状相邻的指南,并依靠WPF的消除锯齿来处理其他形状)。您可能可能能够通过附加属性来完成此操作,以便您可以将其应用于任何元素,但如果它只是需要此行为的一种元素(例如Rectangle),则可能不值得额外付出努力。

好像微软已经意识到了这个问题,太 - WPF 4.0 is expected to feature Layout Rounding,其中,like the version in Silverlight,当布局舍入已启用四舍五入非整数值在渲染过程。

0

我想这些差距并不是实际的差距,而是笔画。当你缩小它时,你只需将笔画缩小到不再可见的程度。我试图在矩形的颜色上绘制笔画,在任何尺度上都可以很好地工作。

 
&ltPage xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Background="Black"> 
    &ltCanvas SnapsToDevicePixels="False"> 
    &ltCanvas.RenderTransform> 
     &ltScaleTransform ScaleX="0.5" ScaleY="0.5"/> 
    </Canvas.RenderTransform> 
    &ltRectangle Canvas.Left="25" Width="100" Height="100" Fill="#CFC" Stroke="#CFC"/> 
    &ltRectangle Canvas.Left="125" Width="100" Height="100" Fill="#CCF" Stroke="#CCF"/> 
    </Canvas> 
</Page> 
+0

这不是中风造成的 - 注意我的例子只填充,而不是中风。通过添加笔画,您可能会将矩形放大到笔画宽度的一半 - 这可以解决问题(如果笔画宽度足够大),但会在内角上产生不需要的工件。 – 2012-11-21 19:47:03