ListBox 中的 WrapPanel 行为:垂直填充可用 space,然后水平环绕

WrapPanel behavior within ListBox: vertical to fill available space and then wrap horizontally

我在自定义滚动查看器中有一个列表框,它提供了一些独特的视觉样式。 Listbox ItemsPanel 是一个 WrapPanel,所有列表框项目都是 100x100。列表框高度是静态的,不会改变。所需的布局是这样的:在包装之前垂直填充可用 space,如下所示:

我已经尝试过 WrapPanel 的两个 Orientation 变量,但未能获得所需的布局。我怀疑这与我将列表框包装在自定义 ScrollViewer 控件中并且列表框无法正确计算可用 space 这一事实有关。由于高度是静态的,我觉得我应该能够完成这项工作(它只能水平滚动,并且外部自定义滚动查看器应该进行滚动)。这是当前精简后的设置:

<controls:CustomScrollViewer HorizontalScrollBarVisibility="Visible" VerticalScrollBarVisibility="Hidden">
    <controls:CustomScrollViewer.Template> .... </controls:CustomScrollViewer.Template>
    <ListBox Height="...">

        <ListBox.ItemsPanel>
            <ItemsPanelTemplate>
                <WrapPanel />
            </ItemsPanelTemplate>
        </ListBox.ItemsPanel>

        <ListBox.ItemTemplate>
            <DataTemplate> .... </DataTemplate>
        </ListBox.ItemTemplate>
        <ListBox.Resources>
            <Style TargetType="{x:Type ListBoxItem}"> .... </Style>
        </ListBox.Resources>
    </ListBox>
</controls:CustomScrollViewer>

有没有办法让列表框在内部使用自定义滚动查看器,而不是将列表框包装在滚动查看器中?或者如何实现所需的布局?

通过硬编码 WrapPanel 的高度,并将方向设置为 Vertical,我能够实现所需的布局。

我仍然对使用自定义滚动查看器替换列表框内部滚动查看器的解决方案感到好奇。