2011-01-05 3 views
6

WPF 경로를 InkCanvas에 추가하고 선택을 사용하여 WPF 경로를 선택하려고합니다. 그래서이 코드를 사용합니다.ActualWidth 및 ActualHeight가 0,0에서 시작하는 이유는 무엇입니까?

System.Windows.Shapes.Path path = drawCanvas.Children[i] as System.Windows.Shapes.Path;  
drawCanvas.Children.RemoveAt(i); 
inkCanvas.Children.Add(path); 

출력 내용입니다. ActualwidthActualHeight이 0,0부터 시작하기 때문에 0,0에서 WPF 경로를 선택해야합니다.

alt text

는 어떻게 절대 WPF 경로를 선택합니까?

감사

편집 :

지금, 나는 절대적으로이 코드를 사용하여 선택할 수 있습니다.

System.Windows.Shapes.Path path = drawCanvas.Children[i] as System.Windows.Shapes.Path; 
drawCanvas.Children.RemoveAt(i); 
path.Margin = new Thickness(-getMinX(path), -getMinY(path), 0, 0); 
containPath.Children.Add(path); 
containPath.Width = getMaxX(path) - getMinX(path); 
containPath.Height = getMaxY(path) - getMinY(path); 
containPath.Margin = new Thickness(getMinX(path), getMinY(path), 0, 0); 
inkCanvas.Children.Add(containPath); 

답변

4

당신은 FrameworkElement.ActualWidth PropertyActualHeight을 업데이트 InkCanvasUIElement.UpdateLayout Method를 사용할 수 있습니다. 이 기능이 필요한 이유에 대한 배경 정보는 ActualWidth 링크를 참조하십시오.

편집 :

내가 질문을 오해. ActualWidthActualHeight은 0이 아니지만 그 값은 에 대한 (0, 0)에 상대적인 값입니다. 처럼 동작

<Canvas Width="50" Height="50" Margin="200,200,0,0"> 
    <Line 
     X1="0" Y1="0" 
     X2="50" Y2="50" 
     Stroke="Black" 
     StrokeThickness="4" /> 
</Canvas> 

:

alt text

이 방법의 단점은 인 문제에 대한 꽤 좋은 해결책은 CanvasPath 포장과 같은 Margin를 사용하여 배치하는 것입니다 사용자는 임의의 모양이 아닌 사각형 인 Canvas을 가져와야합니다. 그럼에도 불구하고, 대상물을 다시 올리는 것보다 훨씬 낫습니다 출처입니다.

만 조절 점을 통해 정의 될 수있는 요소에 대한
+0

저는 UpdateLayout이 아무 것도하지 않을 것이라고 생각합니다. – NVM

+0

우리는 이론을 테스트 할 수있는 코드가 충분하지 않지만'UIElement.IsMeasureValid'가'false' 인 경우'ActualWidth'와'ActualHeight'가 정확하다는 희망은 없습니다. –

+0

제 대답을 참조하십시오. 내 이전 의견에서 나는 UpdateLayout이 'Path'에 대해 아무 것도하지 않는다고 말하고자했다. – NVM

0

당신이 (나는 그것이 선택을 지원하기 때문에 InkCanvas이 가정되는)는 항목 제어에 추가 (예 : 선, 경로 등 사각형, 타원 등에 대한)를 먼저 캔버스가 0,0에 패널에 추가됩니다. 캔버스의 폭과 Height은 제어점의 최대 X 및 Y 좌표로부터 결정됩니다. 이 요소는이 캔버스의 하위 요소로 추가됩니다.

가 당신은 또한 당신이 요소와 행동의이 종류를 볼 때마다, 요소가 늘 등

수평/수직 정렬처럼 나는이 문제를 볼 수있는 유일한 방법은 레이아웃 속성을 지원하는 것을 볼 수

ActualWidth을 발견하는 것입니다 경로의 좌표에서 수동으로 ActualHeight을 입력하십시오.

편집 : 이것은 개인적인 경험에 기인 한 것이며 문서가 아닙니다.

+0

ActualWidth와 ActualHeight를 수동으로 찾을 수 있습니다. 그러나 읽기 전용이므로 ActualWidth 및 ActualHeight로 설정할 수 없습니다. –

+0

ActualWidth 및 ActualHeight는 읽기 전용 종속성 속성입니다 (메모리가 올바르게 작동하는 경우). 당신은 단순히 자신을 설정할 수없고 설정할 수도 없습니다. – NVM

+1

선택 광고자를 위해, 당신이 원하는 것을하기 위해 많은 수작업을해야 할 것입니다. 항목을 inkcanvas에 추가하면 컨테이너 항목으로 래핑됩니다. 이 컨테이너 항목은 선택 adorner가 장식 한 것입니다. 컨테이너에 0,0에서 시작하는 캔바스가 포함되어 있으므로 홀수 선택 상자가 표시됩니다. 선택 사항을 직접 처리하는 파생 컨테이너 항목을 만들어야합니다. – NVM