带列表框的SizeToContent

时间:2018-09-17 11:34:24

标签: wpf

我正在使用SizeToContent =“ WidthAndHeight”,以便可以将窗口的大小调整为当前显示的控件的大小。这工作正常,但是,在显示项目并将其添加到列表框中时遇到了问题。将大量项目添加到列表框中时,这将导致窗口扩展到监视器边缘下方。我注意到,如果没有SizeToContent =“ WidthAndHeight”,我可以轻松获得列表框来限制自身并使用滚动条。但是,这不利于显示所有列表框占用的多余未使用空间,然后再将其显示出来。我在下面添加了一个小示例解决方案来显示此行为。

注释窗口不需要调整大小。它只需要在空间上高效,而且我宁愿不要使用绝对值。

说明期望的行为;用户仅看到按钮,窗口周围没有未使用的空间。单击按钮后,“列表框”现在可见,但尚未扩展到屏幕之外(即已添加滚动条),并且下面的按钮可见。

...ResizeMode="CanMinimize" SizeToContent="WidthAndHeight">
<Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="Auto" />
        <RowDefinition Height="*"/>
        <RowDefinition Height="Auto" />
    </Grid.RowDefinitions>

    <Button Content="hello" Click="Button_Click"/>
    <ListView Name="lbx" Grid.Row="1" Visibility="Collapsed">
    </ListView>
    <Button Name="btn" Content="hello" Grid.Row="2" Visibility="Collapsed"/>

</Grid>

private void Button_Click(object sender, RoutedEventArgs e)
{
    btn.Visibility = Visibility.Visible;
    lbx.Visibility = Visibility.Visible;

    //Have tried various combinations of settings in code at runtime
    this.SizeToContent = SizeToContent.Width;
    this.Height = Double.NaN;

    for (int i = 0; i < 1000; i++)
    {
        lbx.Items.Add("Num:" + i);
    }

}

我也尝试过使用基座面板而不是网格来尝试此操作;

<Button Content="hello" Click="Button_Click" DockPanel.Dock="Top"/>
<Button Name="btn" Content="hello" DockPanel.Dock="Bottom" Visibility="Collapsed"/>
<ListView Name="lbx" Visibility="Collapsed">
</ListView>

尝试将SizeToContent =“ WidthAndHeight”与SizeToContent =“ Width”交换,该窗口将启动,显示所有空白空间,稍后这些空白空间将由折叠的控件使用。

1 个答案:

答案 0 :(得分:2)

您可以根据MaxHeight和屏幕的实际高度来设置窗口的ListBox,例如:

private void Button_Click(object sender, RoutedEventArgs e)
{
    btn.Visibility = Visibility.Visible;
    lbx.Visibility = Visibility.Visible;

    for (int i = 0; i < 5; i++)
    {
        lbx.Items.Add("Num:" + i);
    }

    Dispatcher.Invoke(() =>
    {
        MaxHeight = Math.Min(SystemParameters.WorkArea.Height - Top, grid.ActualHeight);
    }, System.Windows.Threading.DispatcherPriority.Background);
}
  

这似乎是一个不错的选择。一个缺点是,即使列表框项目应该可以容纳,但由于项目数量很少,它仍然会引入滚动条。

然后输入一个偏移量:

private void Button_Click(object sender, RoutedEventArgs e)
{
    btn.Visibility = Visibility.Visible;
    lbx.Visibility = Visibility.Visible;

    for (int i = 0; i < 5; i++)
    {
        lbx.Items.Add("Num:" + i);
    }

    grid.Measure(new Size(double.PositiveInfinity, double.PositiveInfinity));
    grid.Arrange(new Rect(new Size(grid.DesiredSize.Width, grid.DesiredSize.Height)));

    Height = Math.Min(SystemParameters.WorkArea.Height - Top, grid.ActualHeight + 40);
}