在调整大小后,如何使WPF窗口的大小与扩展器的内容保持一致

时间:2009-05-08 21:00:02

标签: .net wpf sizetocontent

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

普通视图

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

折叠

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

调整为新空间

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

到目前为止,这很有效。调整窗口大小后<Expander />折叠时出现问题。而不是窗口再次折叠,列表视图只是隐藏:

调整大小后折叠

alt text 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事件并重置Windows SizeToContent属性。这几乎可行。这将导致它再次折叠窗口,但再次展开时,它会回到原来的100像素高度。虽然存储和捕获这些信息是可行的,但它闻起来很容易出错并且容易出错。

5 个答案:

答案 0 :(得分:62)

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

答案 1 :(得分:11)

最简单的应对方法是通过在窗口上设置ResizeMode="NoResize"来手动调整大小。 然而,如果你有WindowStyle="None"我已经注意到在Vista Aero上这会导致窗口完全脱落“chrome”并且窗口看起来很尴尬。此外,这有点像警察,因为它看起来像你想给用户调整大小的能力。

问题在于您有两个相互冲突的目标:1。)在展开扩展器控件时总是需要SizeToContent="Height",2。)扩展扩展器控件时需要SizeToContent="Height" 除非< / strong>用户手动调整了窗口大小(SizeToContent =“Manual”),在这种情况下,您希望返回用户的手动高度。

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

答案 2 :(得分:3)

试试这个,这应该符合您的需求: SizeToContent =&#34; WidthAndHeight&#34;高度=&#34;自动&#34;宽度=&#34;自动&#34;

答案 3 :(得分:1)

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

答案 4 :(得分:1)

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

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