ActualHeight / ActualWidth - PullRequest
       22

ActualHeight / ActualWidth

2 голосов
/ 13 марта 2012

Я немного запутался с тем, как работает ActualWidth или ActualHeight или как он рассчитывается.

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

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

1 Ответ

7 голосов
/ 13 марта 2012

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