Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How do you keep the WPF window sized to content with an Expander after resize

I've got a WPF window with SizeToContent="Height". This window contains an <Expander /> that displays a list of recent activity. What I'd like is when the expander is expanded the window grows in size proportionally. When hidden the window again resizes proportionally. If the window is resized the expander and it's contained list view should grow to use the new space. (don't mind the colors there there to help me figure this out):

Normal View

alt text http://www.deploylx.com/so/wpfexpander/Open.png

Collapsed

alt text http://www.deploylx.com/so/wpfexpander/Closed.png

Resized to new space

alt text http://www.deploylx.com/so/wpfexpander/Expanded.png

So far this works great. The problem comes when the <Expander /> is collapsed after the window is resized. Rather than the window collapsing again, the list view is simply hidden:

Collapsed after Resize

alt text http://www.deploylx.com/so/wpfexpander/Collapsed.png

My intuition tells me that the Height of the window is being set when the window resizes and thus overrides the SizeToContent property. So, how can I get the window to keep it's size to content behavior after it's been resized?

Current XAML:

<Window x:Class="DeployLX.Licensing.Nlm.Admin.v3.DashboardWindow"     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"     Title="Dashboard" Width="504" SizeToContent="Height" Height="275">    <DockPanel>     <Menu DockPanel.Dock="Top">       <MenuItem Header="_File">         <MenuItem Header="E_xit" Command="{Binding Path=CloseCmd}" />       </MenuItem>     </Menu>     <Grid DockPanel.Dock="Top" Margin="8" ShowGridLines="True">       <Grid.RowDefinitions>         <RowDefinition />         <RowDefinition />       </Grid.RowDefinitions>       <Grid.ColumnDefinitions>         <ColumnDefinition />         <ColumnDefinition />       </Grid.ColumnDefinitions>        <Grid Grid.RowSpan="2" Grid.Row="0" Grid.Column="0" Margin="0,0,8,0">         <Rectangle Fill="Red" />         <TextBlock>ActiveCount</TextBlock>               </Grid>        <Grid Grid.Row="0" Grid.Column="1" Margin="0,0,0,4">         <Rectangle Fill="Green" />         <TextBlock>Authorization</TextBlock>       </Grid>       <Grid Grid.Row="1" Grid.Column="1" Margin="0,4,0,0">         <Rectangle Fill="Blue" />         <TextBlock>Authorization</TextBlock>       </Grid>           </Grid>     <Expander Header="Recent Activity" Margin="8" IsExpanded="True">       <ListView IsSynchronizedWithCurrentItem="True" MinHeight="100">         <ListView.View>           <GridView>             <GridViewColumn Header="Status"/>           </GridView>         </ListView.View>       </ListView>     </Expander>   </DockPanel> </Window> 

UPDATE: I've tried listening to the Collapsed event of the expander and resetting the Windows SizeToContent property. This almost works. It will cause it to collapse the window again but when expanded again it goes back to the original 100 pixel height. While it's feasible to store and capture this info it smells hacky and prone to errors.

like image 231
Paul Alexander Avatar asked May 08 '09 21:05

Paul Alexander


People also ask

What is Expander in WPF?

The WPF Expander represents a control with an expanded view where the contents of the expanded area can be expanded or collapsed. There are two ways to create an expander control in a WPF app. We can create an Expander control at design-time using the <Expander> element of XAML.


2 Answers

You have to make your window non-resizeable if you're going to use SizeToContent. Also, you shouldn't use SizeToContent="Height", and then set an explicit Height. Think about it - which one should WPF believe for the window height, the user's setting or the Content? It can't just switch back and forth between the two.

like image 63
Ana Betts Avatar answered Sep 27 '22 23:09

Ana Betts


The easiest way to cope is to take manual resizing out of the equation by setting ResizeMode="NoResize" on the window. However, if you have WindowStyle="None" I've noticed that on Vista Aero this causes the window to completely shed the "chrome" and the window looks awkward. Also, this somewhat of a cop out since it looks like you want to give the user resizing capabilities.

The problem is that you have two conflicting goals: 1.) you always want SizeToContent="Height" when collapsing the expander control, 2.) you want SizeToContent="Height" when expanding the expander control unless the user has manually resized the window (SizeToContent="Manual"), in which case you'd like to return to the user's manual height.

Yikes. I don't think you can get around saving the expanded height yourself. WPF won't remember the user's manual height upon expanding once you've reverted back to SizeToContent="Height" in your collapsed event handler.

like image 43
Rob Sobers Avatar answered Sep 27 '22 23:09

Rob Sobers