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

Pau*_*der 54 .net wpf sizetocontent

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

普通视图

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

倒塌

alt text 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>
Run Code Online (Sandbox Code Playgroud)

更新:我已经尝试收听扩展器的Collapsed事件并重置Windows SizeToContent属性.这几乎可行.这将导致它再次折叠窗口,但再次展开时,它会回到原来的100像素高度.虽然存储和捕获这些信息是可行的,但它闻起来很容易出错并容易出错.

Ana*_*tts 62

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


Rob*_*ers 11

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

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

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


小智 5

试试这个,这应该符合您的需求:SizeToContent =“ WidthAndHeight” Height =“ Auto” Width =“ Auto”


Tho*_*mas 1

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