ActualWidth
и ActualHeight
вычисляются после вызова Measure
и Arrange
.
Система компоновки WPF вызывает их автоматически после вставки элемента управления в визуальное дерево (на DispatcherPriority.Render
ИМХО, что означает, что они будут поставлены в очередь на выполнение, а результаты не будут доступны мгновенно).
Вы можете подождать, пока они станут доступными, поставив в очередь действие на 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));