Странности WPF RowDefinition

У меня есть приложение, которое я пытаюсь отладить, и я просматриваю различные настройки во время выполнения через snoop.

Проблема у меня вот в чем:

Есть сетка высотой 50,4 . Он имеет 3 определения RowDefinition, каждое из которых имеет высоту 1 звезда (*). Следовательно, можно предположить, что фактическая высота каждого RowDefinition будет равна 50,4/3 (16,8). Однако я вижу, что первые 2 RowDefinitions имеют ActualHeight 25,2, а третий имеет ActualHeight 0. Все три по-прежнему имеют высоту 1 звезду.

Как это возможно ? Я просто вижу, как вы можете достичь этой ситуации. Вы не можете изменить ActualHeight грамматически, так как он доступен только для чтения. Высоты должны быть установлены в проходе аранжировки сетки.

Кто-нибудь знает о каком-либо наборе обстоятельств, которые могли бы привести к этому сценарию.


person Dean Chalk    schedule 21.08.2012    source источник
comment
Можете ли вы предоставить небольшой, но полный пример проекта для воспроизведения такого поведения?   -  person Daniel Hilgarth    schedule 21.08.2012
comment
Боюсь, что нет, есть проблема с этим очень сложным приложением. Что-то создает этот сценарий, который я считал невозможным. Я ищу любые идеи о том, как это могло произойти, что помогло бы мне отследить причину   -  person Dean Chalk    schedule 21.08.2012
comment
Я уверен, что вы получите много информации, пытаясь создать такой минимальный образец. Вы начнете со своего сложного приложения и удалите все больше и больше кода. В какой-то момент вы удаляете какой-то код, и проблема больше не возникает. Теперь вы знаете, что такое оскорбительный фрагмент кода...   -  person Daniel Hilgarth    schedule 21.08.2012
comment
Может быть, кто-то меняет высоту строки из кода программной части?   -  person dvvrd    schedule 21.08.2012
comment
Возможно, я несколько неуклюже выразил желание получить ответ. Я мог бы потратить дни на деконструкцию приложения, и я уверен, что в какой-то момент я получу Эврику. Причина, по которой я разместил здесь вопрос, состоит в том, чтобы посмотреть, «знает ли кто-нибудь» сценарий, который может создать эту ситуацию. Если никто не ответит, то у меня еще много работы :)   -  person Dean Chalk    schedule 21.08.2012


Ответы (1)


Я нашел ответ - я не знаю, является ли это ошибкой WPF или я не прочитал документацию должным образом.

<Border Background="Red" HorizontalAlignment="Center" VerticalAlignment="Center">
    <Grid HorizontalAlignment="Center" VerticalAlignment="Center" Margin="5">
        <Grid.RowDefinitions>
            <RowDefinition Height="*" />
            <RowDefinition Height="*" />
            <RowDefinition Height="*" />
        </Grid.RowDefinitions>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="*" />
            <ColumnDefinition Width="*" />
        </Grid.ColumnDefinitions>
        <TextBox Text="123" Grid.Row="0" Grid.Column="0" HorizontalAlignment="Center" VerticalAlignment="Center" />
        <TextBox Text="123" Grid.Row="0" Grid.Column="1" HorizontalAlignment="Center" VerticalAlignment="Center" />
        <TextBox Text="123" Grid.Row="1" Grid.Column="0" HorizontalAlignment="Center" VerticalAlignment="Center" />
        <TextBox Text="123" Grid.Row="1" Grid.Column="1" HorizontalAlignment="Center" VerticalAlignment="Center" />
        <TextBox Text="123" Grid.Row="2" Grid.Column="0" HorizontalAlignment="Center" VerticalAlignment="Center" Visibility="Collapsed" />
        <TextBox Text="123" Grid.Row="2" Grid.Column="1" HorizontalAlignment="Center" VerticalAlignment="Center" Visibility="Collapsed" />
    </Grid>
</Border>

Если вы посмотрите на код, вы увидите, что есть 3 строки размера звезды (*), которые ВСЕ должны иметь равную долю высоты сетки, независимо от их содержимого.

Однако, когда вы сворачиваете ВСЕ содержимое, назначенное этой строке, ТАКЖЕ сворачивается и сама строка. (если вы отслеживаете его, он имеет высоту *, но ActualHeight равен 0)

Кто-нибудь считает это нормальным поведением? Я никогда не слышал об этом за всю свою разработку WPF за последние 5 лет.

person Dean Chalk    schedule 21.08.2012
comment
Имеет ли ваш Border определенную высоту или он также схлопывается (или сжимается) при схлопывании строки? - person CodingGorilla; 21.08.2012
comment
Ничто не имеет определенной высоты, поэтому размер рамки будет автоматически соответствовать ее содержимому. Вам не нужна рамка, чтобы этот код вел себя так, я поставил границу там, чтобы красный фон показывал вам, что сетка имеет свернутую строку - person Dean Chalk; 21.08.2012
comment
Да, я имел в виду, была ли определенная высота или нет. Если нет определенной высоты, то я бы ожидал такого поведения. Поместите сетку в DockPanel или задайте фиксированную высоту, и вы получите ожидаемое поведение. Это связано с тем, что сетка пытается измерить свою высоту, и, поскольку в строке нечего измерять, строка заканчивается с нулевой высотой и уменьшает общую высоту сетки. - person CodingGorilla; 21.08.2012
comment
Хорошо, я думаю, вы попали в самую точку. По сути, если для сетки нет фиксированного размера, то любая строка, не имеющая назначенного содержимого (или свернутого содержимого) и имеющая размер звезды, в основном исчезнет, ​​как если бы ее вообще не было в XAML. Я предполагаю, что такое же поведение будет очевидным со столбцами. Спасибо за это - не каждый день узнаешь что-то новое, настолько фундаментальное :) - person Dean Chalk; 21.08.2012