Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Fill remaining space of parent with 2 or more expanders WPF

I have 2 expanders inside a dockPanel, i need to fill all the height available inside de dockPanel when a expander is opened and if both of them are open, i need each expander to take the half of the available height so they can fill all the space. Here is my code:

<DockPanel Background="Black">
                    <Expander Name="articlesExpander" Template="{StaticResource ExpanderHeaderImage}" DockPanel.Dock="Top">
                        <Grid Name="articlesGridExpander" ShowGridLines="True" Background="#FFEC0000">
                            <TextBlock>Hello</TextBlock>
                        </Grid>
                    </Expander>
                    <Expander Name="turneroExpander" Template="{StaticResource ExpanderHeaderImage}" DockPanel.Dock="Bottom">
                        <Grid Name="turneroGridExpander" ShowGridLines="True" Height="{Binding ElementName=DummyExpanderHeight, Path=Height}" Background="#FF0AE400">
                            <TextBlock>Bye</TextBlock>
                        </Grid>
                    </Expander>
                </DockPanel>

Here i describe the 3 possible states of the expanders:

1) the first expander is open and the second is closed. As you can see the first expander does not take all the avialble height: enter image description here

2) The second expander is open and the first expander is closed. This is the right behaviour i would like to have with both expanders: enter image description here

3) Both expanders are open. I need them to take half and a half height: enter image description here

How can i achieve the right behaviour of the expanders?

like image 225
Fernando Santiago Avatar asked Oct 21 '25 11:10

Fernando Santiago


1 Answers

You can achieve what you want using pure XAML if using a Grid instead of DockPanel. I don't see the purpose of using DockPanel in this case. Otherwise you need code behind (some Converter) to resize the Expanders correctly.

The idea here is we need a Grid having 2 rows, when the contained Expander is collapsed, the row's Height should be Auto, otherwise the row's Height should be *. When the 2 Expanders are expanded, both the rows have Height of * and each one will share half the whole Height of the Grid:

<Grid Background="Black">
      <Grid.Resources>
         <Style TargetType="RowDefinition">
             <Setter Property="Height" Value="Auto"/>
             <Style.Triggers>
                 <DataTrigger Binding="{Binding Tag.IsExpanded, RelativeSource={RelativeSource Self}}" 
                              Value="True">
                     <Setter Property="Height" Value="*"/>
                 </DataTrigger>
             </Style.Triggers>
         </Style>
      </Grid.Resources>
      <Grid.RowDefinitions>
         <RowDefinition Tag="{Binding ElementName=articlesExpander}"/>
         <RowDefinition Tag="{Binding ElementName=turneroExpander}"/>
      </Grid.RowDefinitions>
      <Expander Name="articlesExpander" Template="{StaticResource ExpanderHeaderImage}">
            <Grid Name="articlesGridExpander" ShowGridLines="True" Background="#FFEC0000">
              <TextBlock>Hello</TextBlock>
            </Grid>
      </Expander>
      <Expander Name="turneroExpander" Template="{StaticResource ExpanderHeaderImage}" Grid.Row="1">
            <Grid Name="turneroGridExpander" ShowGridLines="True" Height="{Binding ElementName=DummyExpanderHeight, Path=Height}" Background="#FF0AE400">
               <TextBlock>Bye</TextBlock>
            </Grid>
      </Expander>
 </Grid>
like image 120
King King Avatar answered Oct 23 '25 00:10

King King



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!