Как получить доступ к фактической высоте элементов с помощью высоты = Авто

У меня такая ситуация:

<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 на некоторых элементах управления.

В вашем примере недостаточно, чтобы мы могли продублировать вашу проблему или узнать, что мы правильно ее рассмотрели. Если вам нужна более конкретная помощь, разверните пример, чтобы мы могли его запустить и увидеть вашу проблему.

Другие вопросы по тегам