Wpf WrapPanel以一条长长的水平线(显示滚动条)而不是环绕线来布置项目

Wpf WrapPanel以一条长长的水平线(显示滚动条)而不是环绕线来布置项目,wpf,xaml,grid,wrappanel,itemspaneltemplate,Wpf,Xaml,Grid,Wrappanel,Itemspaneltemplate,我想要的是,右栏中的项目应该被布置成填充窗口宽度,然后创建一个新行,这正是WrapPanel的用途。 问题是,WrapPanel只在一行中显示项目,下面显示一个水平滚动条,而所有项目都“隐藏”在超出窗口大小的右侧 如何防止出现这种情况?您需要禁用第二个列表框的水平滚动条 <Grid.ColumnDefinitions> <ColumnDefinition Width="Auto"/> <ColumnDefinition /> </Grid.Col

我想要的是,右栏中的项目应该被布置成填充窗口宽度,然后创建一个新行,这正是WrapPanel的用途。
问题是,WrapPanel只在一行中显示项目,下面显示一个水平滚动条,而所有项目都“隐藏”在超出窗口大小的右侧


如何防止出现这种情况?

您需要禁用第二个列表框的水平滚动条

<Grid.ColumnDefinitions>
  <ColumnDefinition Width="Auto"/>
  <ColumnDefinition />
</Grid.ColumnDefinitions>

<Grid.RowDefinitions>
  <RowDefinition Height="Auto"/>
  <RowDefinition/>
  <RowDefinition Height="40"/>
</Grid.RowDefinitions>

<c:SearchTextBox Grid.ColumnSpan="2" .../>

<ScrollViewer VerticalScrollBarVisibility="Auto" Grid.Row="1">
  <ListBox 
    ItemsSource="{Binding Categories}" 
    IsSynchronizedWithCurrentItem="True" 
    ... />
</ScrollViewer>

<!-- Here is what I'm talking about:-->
<ListBox ItemsSource="{Binding Products}"
  IsSynchronizedWithCurrentItem="True" Grid.Column="1" Grid.Row="1">
  <ListBox.ItemsPanel>
    <ItemsPanelTemplate>
      <WrapPanel />
    </ItemsPanelTemplate>
  </ListBox.ItemsPanel>
</ListBox>

....
编辑


另外,您为什么要在第一个列表框中使用ScrollViewer?为什么我要问,ListBox内部已经有ScrollViewer,默认的可见性是自动的。

如果删除ScrollViewer会发生什么?这些项目仍然以水平滚动的方式向右扩展?@Daniel你搞错了。ScrollViewer包装了第一个列表框,其中有两个列表框代表一个主细节场景。问题在于使用WrapPanel作为its ItemsPanelTemplate的第二个列表框。为了澄清为什么会发生这种情况,如果
列表框
启用了水平滚动条(默认情况下是这样),则它会告诉其子对象在无限水平空间中测量自己。通过删除滚动条,您可以强制
WrapPanel
使用有限的宽度,因此它将实际进行包装。@SteveGreatrex:谢谢您的评论。
<ListBox ItemsSource="{Binding}" 
         ScrollViewer.HorizontalScrollBarVisibility="Disabled" ...>
....
</ListBox>