Как получить доступ к фактической высоте элементов с помощью высоты = Авто
У меня такая ситуация:
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="560"/>
<ColumnDefinition Width="250"/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" /> <!-- status infos & content start -->
<RowDefinition Height="Auto" /> <!-- status infos -->
<RowDefinition Height="Auto" /> <!-- status infos -->
<RowDefinition Height="Auto" /> <!-- status infos -->
<RowDefinition Height="*"/> <!-- content ends -->
</Grid.RowDefinitions>
<!-- image a list of custom controls directed to the first or second column on all rows here -->
<SomeCustomControl Grid.Row="0" Grid.Column="0" Grid.ColumnSpan="2" Grid.RowSpan="2" />
</Grid>
Как видите, у меня есть 2 столбца, правый более или менее зарезервирован для информации о статусе, а левый - для контента. "SomeCustomControl" содержит настолько широкий элемент управления, что его необходимо установить в ColumnSpan="2". Обратите внимание, что в правом столбце все еще есть контроль состояния. В SomeCustomControl у меня есть что-то вроде этого:
<Grid x:Name="LayoutRoot">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="250"/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
[...]
<RowDefinition Height="Auto" />
<RowDefinition Height="*" /> <!-- problem control here -->
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<!-- a list of Controls limited to the first column -->
<ProblemControl Grid.Column="0" Grid.ColumnSpan="2" />
</Grid>
Теперь первые строки SomeCustomControl содержат элементы управления, ограниченные первым столбцом, а затем есть строка, содержащая мой ProblemControl. Высота элементов управления статусом не предопределена и зависит от отображаемой информации о состоянии. Элементы управления в SomeCustomControl, ограниченные первым столбцом, также имеют различную высоту, которая в настоящее время определяется автоматически с помощью содержимого.
Теперь у меня проблема в том, что ProblemControl перекрывается с некоторыми из моих элементов управления состоянием. Я пытался вычислить высоту своих элементов управления состоянием и ограниченных элементов управления в SomeCustomControl, но так как все элементы управления имеют динамический размер, я не могу получить правильную высоту. Высота RowDefinitions содержит высоты типа Auto и значение 1, высота конкретных элементов управления, по-видимому, равна NaN.
Любые идеи относительно того, как я могу вычислить высоты или предотвратить перекрытия другими способами.
3 ответа
Я столкнулся с той же проблемой, но недавно нашел решение. Причина, по которой вы не можете получить доступ к свойствам ширины и высоты элемента управления с шириной или высотой, для которых установлено значение Авто, заключается в том, что система времени выполнения запрашивает значения свойств до того, как они были установлены. Свойства ActualWidth
а также ActualHeight
утверждая, что вы получили высоту отображаемых элементов управления, теоретически вы могли бы просто подождать, пока приложение SL завершит загрузку, а затем выполнить запрос, поскольку к тому времени элементы управления будут отображаться, и, следовательно, ActualHeight
/ActualWidth
значения должны быть установлены.
К сожалению, это не так. Кажется, нет никакой гарантии, когда эти значения установлены, поэтому я использовал обходной путь в SizeChanged
- событие управления, значения которого я хочу. SizeChanged
запускается всякий раз, когда изменяются свойства элемента управления по ширине и высоте, поэтому, если я обработаю это событие, я гарантирую, что значения будут отличны от NaN.
Сделайте любую логику, которую вам нужно выполнить в обработчике для этого события, и вы обнаружите, что значения установлены.
Вы пробовали использовать свойство ActualHeight для контроля?
Вы должны быть в состоянии решить эту проблему с надлежащим использованием Grid
и некоторые панели (DockPanel
а также StackPanel
может быть весьма полезным). Вам также может понадобиться HorizontalAlignment
или же VerticalAlignment
свойства установлены в Stretch
на некоторых элементах управления.
В вашем примере недостаточно, чтобы мы могли продублировать вашу проблему или узнать, что мы правильно ее рассмотрели. Если вам нужна более конкретная помощь, разверните пример, чтобы мы могли его запустить и увидеть вашу проблему.