我正在使用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”交换,该窗口将启动,显示所有空白空间,稍后这些空白空间将由折叠的控件使用。
答案 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);
}