2009-06-22 4 views
0

일부 드로잉 응용 프로그램을 만들려고하고 있는데 "선택 모드"에서 이상한 결과가 나타납니다. Rectangle을 그리고 "select it"RenderSize가 적절한 Size를 반환하지만 Line이 선택되면 RenderSize는 Width를 Line.X2로 설정하고 Height를 Line.Y2로 설정 한 Size를 반환합니다. 예 : X1 = 50, Y1 = 50, X2 = 130, Y2 = 90에서 끝나는 선은 Width = 130 및 Height = 90 인 크기를 반환합니다. 선택 사항에 UIElement 유형의 요소가 포함되어 있으므로 실제로는 신경 쓰지 않아야합니다.) 내가 할 수있는대로 제 선택 모드를 일반화하기 위해 어떤 모양이 선택되고 사용자가 선택한 모양을 움직이는 동안 테두리 상자를 그려야합니다.WPF - UIElement.RenderSize가 선 모양에 맞지 않습니다.

Google에 문제가 있지만 아무 관련이 없으므로 도움이 될 수 있습니다. Line이 점을 명시 적으로 설정하는 동안 Rectangle의 위치는 Canvas에 의해 설정 되었기 때문에입니까?

답변

3

130x90으로 표시되는 이유는 인용 이유 때문입니다. WPF의 Rectangle은 위치가 적습니다. 높이/너비이므로 두 크기 값은 같습니다.

그러나 점으로 정의 된 선은 반드시 원점에서 필요한 오프셋을 정의하므로 오프셋이 경계 상자에 포함됩니다.

은 또한 당신이 더 그것을 상쇄하기 위해 라인 물체로 Canvas.Top/Left 속성을 계속 사용할 수 있습니다, 예를 들면 : 그래서

<Canvas> 
    <Line X1="50" X2="130" Y1="50" Y2="90" StrokeThickness="1" Stroke="Blue" Canvas.Top="50" Canvas.Left="30"></Line> 
    </Canvas> 
+0

, 일반적으로 적당한 크기 (또는 무언가를 검색 할 수있는 방법이있다 그것과 같은) UIElement의 테두리 상자를 표시 할 수 있습니까? Line (또는 다른 문제가있는 다른 Shape)에 대한 특수 테스트 및 처리 방법에 대한 아이디어가 마음에 들지 않습니다. – grapkulec

+0

0,0을 X1, Y1로 사용하지 않는 특별한 이유가 있습니까? 이 경우 정확한 바운딩 박스를 사용하고 Canvas.Top/Canvas.Left를 사용하면 Rectangle 객체를 배치하는 것과 같은 방법으로 Canvas.Top/Canvas.Left를 사용할 수 있습니다. – micahtan

+0

그러면 0,0을 선의 점 중 하나로서 사용하고 그 점의 좌표를 변경하는 대신 Canvas.SetLeft/Canvas.SetTop 메쏘드와 두 번째 점으로 선을 이동 하시겠습니까? 실제로 그게 효과가 있을지도 몰라 :)하지만 여전히 더 직관적이거나 우아한 방법이 있어야합니다. – grapkulec

관련 문제