2012-03-13 7 views
2

나는 ActualWidth 또는 ActualHeight의 작동 방식이나 계산 방법과 다소 혼동을 느낍니다. 나는 위의 코드를 사용하면ActualHeight/ActualWidth

<Ellipse Height="30" Width="30" Name="rightHand" Visibility="Collapsed"> 
    <Ellipse.Fill> 
     <ImageBrush ImageSource="Images/Hand.png" /> 
    </Ellipse.Fill> 
</Ellipse> 

, 나는 ActualWidthActualHeight 30을 얻는다. 하지만 프로그래밍 방식으로 타원을 정의 할 때 ActualWidthActualHeight은 0입니다. 최대 (max) 높이 및 (max) width 특성을 정의하더라도 - 0이 될 수있는 방법을 이해하지 못합니까?

답변

7

ActualWidthActualHeightMeasureArrange을 호출 한 후 계산됩니다.

WPF의 레이아웃 시스템은 컨트롤을 시각적 트리에 삽입 한 후 자동으로 호출합니다 (DispatcherPriority.Render IMHO는 실행 대기열에 넣어서 결과를 즉시 사용할 수 없음을 의미합니다).
DispatcherPriority.Background에 작업을 대기 시키거나 수동으로 메서드를 호출하여 사용할 수있을 때까지 기다릴 수 있습니다. 디스패처 변형에 대한

예 :

Ellipse ellipse = new Ellipse(); 

ellipse.Width = 150; 
ellipse.Height = 300; 

ellipse.Measure(new Size(1000, 1000)); 
ellipse.Arrange(new Rect(0, 0, 1000, 1000)); 

MessageBox.Show(String.Format("{0}x{1}", ellipse.ActualWidth, ellipse.ActualHeight)); 
: 명시 적 호출

Ellipse ellipse = new Ellipse(); 

ellipse.Width = 150; 
ellipse.Height = 300; 

this.grid.Children.Add(ellipse); 

this.Dispatcher.BeginInvoke(DispatcherPriority.Background, new Action(() => 
{ 
    MessageBox.Show(String.Format("{0}x{1}", ellipse.ActualWidth, ellipse.ActualHeight)); 
}));