我ListBox
内有DockPanel
。我想找出ListBox
的大小应该是什么,所以它没有滚动条。我使用ListBox.DesiredSize
但实际上DesiredSize
等于ListBox.ActualWidth
/ Height
而ListBox
有滚动条,因为有更多项可以适合其高度。
如何获得真正想要的尺寸?
答案 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)
如何获得真正所需的尺寸?
如果您没有明确设置其Height
或VerticalAlignment
属性并且避免将其放在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}}