2012-03-13 41 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です - どうすれば0になるのか分かりません。

答えて

7

ActualWidthおよびActualHeightは、MeasureおよびArrangeを呼び出した後に計算されます。

コントロールをビジュアルツリーに挿入すると、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)); 
}));