2012-03-13 2 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> 

Когда я использую приведенный выше код, я получаю 30 для ActualWidth и ActualHeight. но когда я программно определяю Ellipse, ActualWidth и ActualHeight равны 0, даже если я определяю (max) высоту и (максимальный) атрибут width - я не понимаю, как это может быть 0?

ответ

7

ActualWidth и ActualHeight рассчитываются после звонка Measure и Arrange.

Система компоновки WPF автоматически их называет после вставки элемента управления в визуальное дерево (в DispatcherPriority.Render IMHO, что означает, что они будут поставлены в очередь для выполнения, и результаты будут недоступны мгновенно).
Вы можете дождаться, когда они станут доступными, поставив в очередь действие на DispatcherPriority.Background) или путем вызова методов вручную.

Пример для диспетчерской варианты:

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)); 
})); 

Пример для явного вызова:

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));