如何使WPF列表框始终为4个网格行的高度?
如何使我的列表框成为行的标准高度,即使在我向列表框添加了几个项目之后?我也不想给这两个设定一个高度。我尝试设置一些共享大小组,尝试将每行的高度绑定到不同的行,等等,但没有找到解决方案。我希望列表框占据的四行的高度与它们原来的高度相同。列表框当前会增长以适应其中的所有项目,因此会使行更高,这是我不希望看到的。如果列表框高于4“正常”行高度,我希望列表框只显示滚动条。如果我必须在列表框上设置一个maxHeight,我怎么能告诉它是我的另一行高度的4倍 XAML:如何使WPF列表框始终为4个网格行的高度?,wpf,listbox,grid,height,rows,Wpf,Listbox,Grid,Height,Rows,如何使我的列表框成为行的标准高度,即使在我向列表框添加了几个项目之后?我也不想给这两个设定一个高度。我尝试设置一些共享大小组,尝试将每行的高度绑定到不同的行,等等,但没有找到解决方案。我希望列表框占据的四行的高度与它们原来的高度相同。列表框当前会增长以适应其中的所有项目,因此会使行更高,这是我不希望看到的。如果列表框高于4“正常”行高度,我希望列表框只显示滚动条。如果我必须在列表框上设置一个maxHeight,我怎么能告诉它是我的另一行高度的4倍 XAML: 我希望它始终保持外观(以及列
我希望它始终保持外观(以及列表框中没有项目时的外观):
在我将项目添加到列表框后它会执行什么操作:
为VIV的建议编辑:
<Window x:Class="SharedSizes.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<Window.Resources>
<!--<Style TargetType="{x:Type RowDefinition}">
<Setter Property="Height" Value="25"/>
</Style>-->
</Window.Resources>
<Border Margin="10" >
<StackPanel>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition />
<ColumnDefinition />
<ColumnDefinition />
<ColumnDefinition />
<ColumnDefinition />
<ColumnDefinition />
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition />
<RowDefinition />
<RowDefinition />
</Grid.RowDefinitions>
<!--Left Side Parts-->
<Label Content="Vendor:" Grid.Row="0" Grid.Column="0" />
<ComboBox Grid.Row="0" Grid.Column="1" Grid.ColumnSpan="3" />
<Label Content="Billing Model:" Grid.Row="1" Grid.Column="0" />
<ComboBox Grid.Row="1" Grid.Column="1" Grid.ColumnSpan="2" />
<Label Content="Billing Cycle:" Grid.Row="2" Grid.Column="0"/>
<ComboBox Grid.Row="2" Grid.Column="1" Grid.ColumnSpan="2" />
<StackPanel Grid.Row="2" Grid.Column="3" Orientation="Horizontal" >
<Button Content="1"/>
<Button Content="2"/>
<Button Content="3"/>
<Button Content="4"/>
</StackPanel>
</Grid>
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="{Binding ElementName=SomeLabel, Path=DesiredSize.Height}"/>
<RowDefinition Height="{Binding ElementName=SomeLabel, Path=DeisredSize.Height}"/>
<RowDefinition Height="{Binding ElementName=SomeLabel, Path=DeisredSize.Height}"/>
<RowDefinition Height="{Binding ElementName=SomeLabel, Path=DeisredSize.Height}"/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition />
<ColumnDefinition />
<ColumnDefinition />
<ColumnDefinition />
<ColumnDefinition />
<ColumnDefinition />
</Grid.ColumnDefinitions>
<Label Content="Fred" Grid.Row="0" x:Name="SomeLabel"/>
<Label Content="Fred" Grid.Row="0" Grid.Column="1"/>
<Label Content="Fred" Grid.Row="0" Grid.Column="2" />
<Label Content="Fred" Grid.Row="0" Grid.Column="3"/>
<Label Content="Fred" Grid.Row="0" Grid.Column="4"/>
<Label Content="Fred" Grid.Row="1"/>
<Label Content="Fred" Grid.Row="2"/>
<Label Content="Fred" Grid.Row="3"/>
<ListView Name="FredBox" Grid.Row="0" Grid.Column="5" Grid.RowSpan="4" />
</Grid>
</StackPanel>
</Border>
您可以通过使用每行中另一项(您拥有的
标签
)的所需大小.高度设置网格.Row
的高度
因此,通过切换:
...
<!--<RowDefinition Height="{Binding ElementName=Row1, Path=ActualHeight}"/>
<RowDefinition Height="{Binding ElementName=Row1, Path=ActualHeight}" />
<RowDefinition Height="{Binding ElementName=Row1, Path=ActualHeight}" />
<RowDefinition Height="{Binding ElementName=Row1, Path=ActualHeight}" />-->
...
<Label Grid.Row="0"
Content="Fred" />
...
只有第一行是正确的
这是DesiredSize
而不是
您可以通过在每行中使用另一项(您拥有的标签
)的DesiredSize.Height
设置网格.Row
的高度来实现
因此,通过切换:
...
<!--<RowDefinition Height="{Binding ElementName=Row1, Path=ActualHeight}"/>
<RowDefinition Height="{Binding ElementName=Row1, Path=ActualHeight}" />
<RowDefinition Height="{Binding ElementName=Row1, Path=ActualHeight}" />
<RowDefinition Height="{Binding ElementName=Row1, Path=ActualHeight}" />-->
...
<Label Grid.Row="0"
Content="Fred" />
...
只有第一行是正确的
它是DesiredSize
而不是DeisredSize
如果跟踪到自动大小,它将增长以适应内容。我认为您需要设置列表框的高度,或者设置网格行的高度。你有什么反对的理由吗?最外层的容器是stackpanel这一事实可能是有问题的,因为它们的大小通常很不理想。如果我必须将其设置为一个高度,我如何告诉它是其他行的4倍?我希望我所有的行基本上都是相同的高度。我想我必须为行选择一个高度并将其应用于所有行?@user1029770是的,我只是在底部设置了一些缓冲空间,并设置一行,其中不包含其他内容无法扩展的内容。您应该编写自己的VirtualzingStackPanel。如果跟踪到Auto大小,它将增长以适应内容。我认为您需要设置列表框的高度,或者设置网格行的高度。你有什么反对的理由吗?最外层的容器是stackpanel这一事实可能是有问题的,因为它们的大小通常很不理想。如果我必须将其设置为一个高度,我如何告诉它是其他行的4倍?我希望我所有的行基本上都是相同的高度。我想我必须为行选择一个高度,并将其应用于所有行?@user1029770是的,我只需要在底部设置一些缓冲空间,然后设置一个不包含任何其他内容的行。你应该编写自己的VirtualzingStackPanel。@Viv-在尝试了你的建议后,我编辑了原始帖子以显示结果。我仍然看到列表框在增长,因此行的高度也变得太大。与您的解决方案有什么不同?太棒了!谢谢你的帮助,这正是我现在想要的。都是些小事,对吧@在我尝试了你的建议后,我编辑了原始帖子以显示结果。我仍然看到列表框在增长,因此行的高度也变得太大。与您的解决方案有什么不同?太棒了!谢谢你的帮助,这正是我现在想要的。都是些小事,对吧?!
<RowDefinition Height="{Binding ElementName=SomeLabel, Path=DesiredSize.Height}" />
<RowDefinition Height="{Binding ElementName=SomeLabel, Path=DesiredSize.Height}" />
<RowDefinition Height="{Binding ElementName=SomeLabel, Path=DesiredSize.Height}" />
<RowDefinition Height="{Binding ElementName=SomeLabel, Path=DesiredSize.Height}" />
...
<Label x:Name="SomeLabel"
Grid.Row="0"
Content="Fred" />
...
...
<RowDefinition Height="{Binding ElementName=SomeLabel, Path=DesiredSize.Height}" />
<RowDefinition Height="{Binding ElementName=SomeLabel, Path=DeisredSize.Height}"/>
<RowDefinition Height="{Binding ElementName=SomeLabel, Path=DeisredSize.Height}"/>
<RowDefinition Height="{Binding ElementName=SomeLabel, Path=DeisredSize.Height}"/>
...