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

답변

2

가이드 라인 (GuidelineSet on MSDN 참조)을 사용하고 직사각형의 OnRender 메서드를 재정 의하여 테두리가 장치의 픽셀 경계와 일렬로 배치되도록하는 것이 좋습니다. WPF는 지침을 사용하여 도면을 스냅할지 여부와 위치를 결정합니다.

내부적으로 SnapsToDevicePixels가 개체가 장치 픽셀과 일렬로 정렬되도록하기 위해 내부적으로 사용하지만 안내선을 수동으로 배치하여 스냅 동작을 적용 할 때와 적용하지 않을 때를 제어 할 수 있습니다. 이미지가 완전히 축소 된 경우 드로잉 가이드 라인을 피하거나 셰이프가 다른 셰이프 옆에 놓이는 지침을 그리며 WPF의 앤티 앨리어싱을 사용하여 나머지 부분을 처리 할 수 ​​있습니다. 은 첨부 된 속성으로 모든 요소에 적용 할 수 있도록 할 수 있습니다. 단,이 동작이 필요한 단 하나의 요소 유형 (예 : 직사각형) 인 경우 추가 작업을 할 필요가 없을 것입니다. 그것은 마이크로 소프트처럼 보인다

도이 문제를 알고 - 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

스트로크에 의한 것이 아니라, 필자의 예가 스트로크가 아니라 채우기 만했는지 확인하십시오. 획을 추가하면 직사각형이 획 폭의 절반만큼 크게 만들어 지므로 문제를 해결할 수 있지만 (스트로크 폭이 충분히 크면) 내부 모서리에 원하지 않는 아티팩트가 생길 수 있습니다. –

관련 문제