56

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

普通视图

替代文字 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 />调整窗口大小后折叠时出现问题。列表视图并没有再次折叠,而是简单地隐藏了:

调整大小后折叠

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

我的直觉告诉我,Height当窗口调整大小并因此覆盖SizeToContent属性时,正在设置窗口的 。那么,如何让窗口在调整大小后保持其大小以适应内容行为?

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

更新:我尝试监听扩展器的 Collapsed 事件并重置 WindowsSizeToContent属性。这几乎可以工作。它会导致它再次折叠窗口,但当再次展开时,它会回到原来的 100 像素高度。虽然存储和捕获这些信息是可行的,但它闻起来很老套,而且容易出错。

4

5 回答 5

66

如果要使用 SizeToContent,则必须使窗口不可调整大小。此外,您不应使用 SizeToContent="Height",然后设置显式高度。想一想 - WPF 应该相信哪个窗口高度、用户设置或内容?它不能只是在两者之间来回切换。

于 2009-06-11T22:26:57.383 回答
11

最简单的应对方法是通过ResizeMode="NoResize"在窗口上设置手动调整大小。 但是,如果您有的话,WindowStyle="None"我注意到在 Vista Aero 上这会导致窗口完全脱落“镀铬”并且窗口看起来很尴尬。此外,这有点逃避,因为看起来您想为用户提供调整大小的功能。

问题是您有两个相互冲突的目标:1.)您SizeToContent="Height"在折叠扩展器控件时总是想要,2.)SizeToContent="Height"在展开扩展器控件时您想要,除非用户手动调整了窗口大小(SizeToContent="Manual"),其中如果您想返回到用户的手动高度。

哎呀。我认为您无法自己保存扩展的高度。一旦您恢复到SizeToContent="Height"折叠的事件处理程序中,WPF 将不会在展开时记住用户的手动高度。

于 2009-07-17T11:30:03.767 回答
10

试试这个,它应该符合您的需求:

<Window ...
        SizeToContent="WidthAndHeight"  
        Height="Auto" 
        Width="Auto">
于 2016-07-15T09:52:05.110 回答
2

我发现将 Window 的主体放在 View 中,然后将 View 作为唯一的孩子放在窗口中解决了类似的问题......

不是最理想的解决方案,但它似乎有效。

于 2009-06-11T22:17:24.583 回答
1

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

于 2009-05-09T04:51:43.300 回答