【问题标题】:How do you keep the WPF window sized to content with an Expander after resize调整大小后如何使用 Expander 保持 WPF 窗口的大小
【发布时间】:2010-10-24 21:57:00
【问题描述】:

我有一个带有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 像素高度。虽然存储和捕获这些信息是可行的,但它闻起来很老套,而且容易出错。

【问题讨论】:

    标签: .net wpf sizetocontent


    【解决方案1】:

    试试这个,它应该适合你的需要:

    <Window ...
            SizeToContent="WidthAndHeight"  
            Height="Auto" 
            Width="Auto">
    

    【讨论】:

    • 就像内部带有数据网格的网格的魅力。但用户仍然可以更改窗口大小。很好,虽然这样做之后,它不会再自动调整大小了
    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

          【解决方案5】:

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

          【讨论】:

          • 是的...重置 SizeToContent 属性具有相同的基本效果,但随后您会失去展开状态:(。仍在努力。
          • 谁能解释一下汤姆的意思?如何将高度或宽度设置为 Double.NaN?
          • 针对某些事件,您可以设置 Control.Height = Double.Nan;
          猜你喜欢
          • 2015-02-11
          • 1970-01-01
          • 2013-06-24
          • 1970-01-01
          • 1970-01-01
          • 2011-03-30
          • 1970-01-01
          • 2011-02-13
          • 1970-01-01
          相关资源
          最近更新 更多