PureNsanity
Во - первых, вы должны сохранить высоту первой части. Если вы автоматически определяете размер области расширителя, вы можете просто раздавить первый элемент управления, поэтому вам нужно установить первый ряд в Auto и/или MinHeight
В строках расширителя вы действительно хотите использовать автоматическую высоту, чтобы при сворачивании он не занимал места для других, но с двумя расширителями максимальные высоты будут зависеть от расширенного состояния другого. Есть гораздо более простые подходы для правильной калибровки одного расширителя.
Расширители-это бесконечные элементы управления высотой, такие как StackPanel, то есть они не ограничены пределами своего контейнера. Таким образом, это означает, что если у вас есть большой контент, и вы не устанавливаете его максимальную высоту, то первый расширитель может взорвать Нижний расширитель с экрана.
Хитрость в этом случае заключается в использовании элемента управления с ограниченным размером в качестве заполнителя для получения оставшегося размера. На самом деле есть несколько ситуаций, которые делают жизнь немного проще...
Ниже приведен пример, с которым вы можете поиграть, который должен работать для вас:
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<TextBlock Text="Fixed Line"/>
<Rectangle x:Name="RectangleSizeHolder"
Grid.Row="1"
SizeChanged="RectangleSizeHolder_SizeChanged"/>
<Grid Grid.Row="1">
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<Expander x:Name="FirstExpander"
Grid.Row="0"
Height="Auto"
MinHeight="30"
Header="First Header"
Expanded="ExpanderChanged"
Collapsed="ExpanderChanged">
<Expander.Content>
<ScrollViewer VerticalScrollBarVisibility="Auto">
<DockPanel Height="1000"
LastChildFill="False">
<TextBlock DockPanel.Dock="Top" Text="Top First"/>
<TextBlock DockPanel.Dock="Bottom" Text="Bottom First"/>
</DockPanel>
</ScrollViewer>
</Expander.Content>
</Expander>
<Expander x:Name="SecondExpander"
Grid.Row="1"
Height="Auto"
MinHeight="30"
Header="Second Header"
Expanded="ExpanderChanged"
Collapsed="ExpanderChanged">
<Expander.Content>
<ScrollViewer VerticalScrollBarVisibility="Auto">
<DockPanel Height="1000"
LastChildFill="False">
<TextBlock DockPanel.Dock="Top" Text="Top Second"/>
<TextBlock DockPanel.Dock="Bottom" Text="Bottom Second"/>
</DockPanel>
</ScrollViewer>
</Expander.Content>
</Expander>
</Grid>
С кодом:
private void ExpanderChanged(object sender, RoutedEventArgs e)
{
SetHeights();
}
private void RectangleSizeHolder_SizeChanged(object sender, SizeChangedEventArgs e)
{
SetHeights();
}
private void SetHeights()
{
FirstExpander.MaxHeight = !SecondExpander.IsExpanded ? RectangleSizeHolder.ActualHeight - SecondExpander.MinHeight :
RectangleSizeHolder.ActualHeight / 2;
SecondExpander.MaxHeight = !FirstExpander.IsExpanded ? RectangleSizeHolder.ActualHeight - FirstExpander.MinHeight :
RectangleSizeHolder.ActualHeight / 2;
}