如何获得ListBox的所需高度,以便它没有滚动条,其内容适合那里

时间:2017-03-30 19:27:17

标签: wpf

ListBox内有DockPanel。我想找出ListBox的大小应该是什么,所以它没有滚动条。我使用ListBox.DesiredSize但实际上DesiredSize等于ListBox.ActualWidth / HeightListBox有滚动条,因为有更多项可以适合其高度。 如何获得真正想要的尺寸?

2 个答案:

答案 0 :(得分:1)

如果你想摆脱列表框中的滚动条而不是在wpf应用程序中创建静态高度,你可以禁用滚动条属性。

在XAML中:

<ListBox ScrollViewer.HorizontalScrollBarVisibility="Disabled" />
<ListBox ScrollViewer.VerticalScrollBarVisibility="Disabled" />

在C#中:

myListBox.SetValue(ScrollViewer.HorizontalScrollBarVisibilityProperty, ScrollBarVisibility.Disabled);
myListBox.SetValue(ScrollViewer.VerticalScrollBarVisibilityProperty, ScrollBarVisibility.Disabled);

您可以停用滚动条

或者

VerticalScrollBarVisibility="Auto"

并设置列表框滚动条的任何高度,只有内容达到其最大列表框高度。

尝试通过下面的XAML将ListBox高度属性绑定到LayoutRoot Grid的ActualHeight来实现所需的高度:

<Grid x:Name="LayoutRoot" Background="LightGray">
<Grid.ColumnDefinitions>
    <ColumnDefinition Width=".24*"/>
    <ColumnDefinition Width=".73*"/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
    <RowDefinition Height=".9*"/>
    <RowDefinition Height=".1*"/>
</Grid.RowDefinitions>
<ListBox Name="Subdivisions" SelectedItem="{Binding SelectedSubdivisionViewModel}" ItemsSource="{Binding Path=Subdivisions}" Grid.IsSharedSizeScope="True" Height="{Binding ElementName=LayoutRoot, Path=ActualHeight}" >

重要的是:

 Height="{Binding ElementName=LayoutRoot, Path=ActualHeight}"

也可以通过祖先类型实现:

 Height="{Binding Path=ActualHeight, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Grid}}}"
  

我的工作代码可以将其从网格更改为Dockpanel。

答案 1 :(得分:1)

  

如何获得真正所需的尺寸?

如果您没有明确设置其HeightVerticalAlignment属性并且避免将其放在Panel中,则会自动计算StackPanel的所需大小测量具有无限空间的孩子,例如ListBox

ListBoxItem本身的所需大小与所有ListBox容器的聚合大小不同。实际上,没有简单的方法可以准确计算这个高度,因为如果您没有禁用ListBox的UI虚拟化,并非所有容器都是预先生成的。

最简单的解决方法/解决方案可能是在加载<ListBox x:Name="lb" Loaded="lb_Loaded"> <ListBoxItem>1</ListBoxItem> <ListBoxItem>2</ListBoxItem> <ListBoxItem>3</ListBoxItem> </ListBox> 后获取第一个容器的高度,然后将该值与实际项目数相乘,例如:

private void lb_Loaded(object sender, RoutedEventArgs e)
{
    ListBoxItem lbi = lb.ItemContainerGenerator.ContainerFromIndex(0) as ListBoxItem;
    if (lbi != null)
    {
        lb.Height = lbi.ActualHeight * lb.Items.Count + /* add some offset */ 5;
    }
}
{{1}}