如何在resize后将WPF窗口的大小保持为Expander的内容

我有一个SizeToContent="Height"的WPF窗口。 该窗口包含一个显示最近活动列表的<Expander /> 。 我想要的是膨胀机膨胀时窗口按比例成长。 当隐藏窗口再次按比例调整。 如果窗口被resize的扩展器和它包含的列表视图应该增长到使用新的空间。 (不介意那里的颜色,以帮助我解决这个问题):

普通视图

替代文字http://www.deploylx.com/so/wpfexpander/Open.png

倒塌

替代文字http://www.deploylx.com/so/wpfexpander/Closed.png

调整到新的空间

替代文字http://www.deploylx.com/so/wpfexpander/Expanded.png

到目前为止,这工作很好。 在窗口大小调整后, <Expander />被折叠时,问题就出现了。 而不是窗口再次崩溃,列表视图是隐藏的:

resize后折叠

替代文字http://www.deploylx.com/so/wpfexpander/Collapsed.png

我的直觉告诉我,当窗口resize时,窗口的Height被设置,因此覆盖了SizeToContent属性。 那么,如何让窗口在resize后保持其内容行为的大小呢?

当前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> 

更新:我试着收听Expander的Collapsed事件并重置Windows SizeToContent属性。 这几乎工作。 它会导致它再次崩溃的窗口,但是当再次展开它回到原来的100像素的高度。 虽然存储和捕获这些信息是可行的,但是它闻起来很冒险,而且容易出错。

如果要使用SizeToContent,则必须使窗口不可resize。 此外,你不应该使用SizeToContent =“高度”,然后设置一个明确的高度。 想想看 – WPF应该相信窗口高度,用户设置还是内容? 它不能在两者之间来回切换。

最简单的方法是通过在窗口上设置ResizeMode="NoResize"来手动resize。 但是 ,如果你有WindowStyle="None"我注意到在Vista Aero上这会导致窗口完全脱落“铬”,窗口看起来很尴尬。 另外,这看起来像是你想给用户resize的function。

问题是,你有两个相互冲突的目标:1)当折叠扩展控件时,你总是需要SizeToContent="Height" ; 2)扩展扩展控件时需要SizeToContent="Height"除非用户手动调整窗口大小(SizeToContent =“Manual”),在这种情况下,您想返回到用户的手动高度。

让人惊讶。 我不认为你可以绕过自己节约扩大的高度。 一旦在折叠事件处理程序中恢复为SizeToContent="Height" ,WPF将不会记住用户的手动高度。

试试这个,这应该适合你的需要:SizeToContent =“WidthAndHeight”Height =“Auto”Width =“Auto”

正如我在我的问题中发现的,将Height设置为Double.NaN会导致它重置为SizeToContent的快乐。 我不知道它是否会记住你的扩张器的大小。 您可以尝试Kent的Resizer控件将尺寸调整行为移至扩展器而不是包含窗口。

我已经发现,把我的窗口的身体放在一个视图,然后把视图作为唯一的孩子在窗口中解决了类似的问题…

不是最理想的解决scheme,但它似乎工作。