2009-06-07 90 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