Получить RowDefinition высоту программно - PullRequest
3 голосов
/ 05 марта 2010

У меня есть этот XAML:

<Grid Background="LightYellow" Height="150" Width="150">
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto" />
            <RowDefinition Height="*" />
        </Grid.RowDefinitions>
</Grid>

И я пытаюсь получить высоту второго ряда следующим образом:

height = grid.RowDefinitions[1].Height.Value;

Но я получаю 1. Я пробовал ActualSize, и он тоже не работает (возвращает 0). Как я могу получить высоту строки?

Ответы [ 2 ]

3 голосов
/ 05 марта 2010

Во-первых, причина, по которой Height.Value возвращает 1, заключается в том, что Height - это GridLength с GridUnitType of Star. 1 соответствует пропорциональному размеру звезды (например, высота = "2 *", высота = "3 *" и т. Д.). То есть вы не можете читать GridLength.Value изолированно: у вас есть для чтения вместе с GridUnitType.

Теперь к реальной проблеме. WPF не вычисляет ActualHeight элементов, пока они не будут измерены, что он делает как часть прохода отображения. Из документов RowDefinition.ActualHeight :

При добавлении или удалении строк или столбцы, ActualWidth для всех Элементы ColumnDefinition и ActualHeight of RowDefinition элементы становятся равными нулю, пока мера не станет называется.

Так что, если вы попытаетесь получить ActualHeight до того, как WPF вызовет Measure, вы получите 0 или какой-то другой плохой результат.

К счастью, на самом деле не нужно , чтобы получить ActualHeight: поскольку WPF собирается изменить размер вашего объекта на доступное пространство (из-за размера звезды), вы можете на самом деле обрабатывать объект своим собственным SizeChanged. событие или переопределить OnRenderSizeChanged. В зависимости от того, как работает рендеринг, этот обработчик событий может обновить набор дочерних объектов объекта (если объект является объектом типа панели или рисунка) или принудительно выполнить повторный рендеринг с использованием InvalidateVisual (если объект рисуется в более непосредственном режиме). стиль режима, например, путем переопределения OnRender).

0 голосов
/ 05 марта 2010

Что вы пытаетесь сделать?

Возможно, вы захотите рассмотреть возможность наследования от сетки и переопределения методов меры и аранжировки, если вы пытаетесь изменить макет по умолчанию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...