堆栈面板内可调整大小的 WPF 列表框?

Resizable WPF listbox inside Stack Panel?

我正在尝试在 WPF 控件内创建一个列表框,该控件 (1) 的最小高度为 80,并且 (2) 如果需要查看更多列表项,用户可以将其调整为更大的垂直高度.我还希望控件在嵌套在垂直 stackPanel 中时随着用户扩展列表而扩展高度。我一直在玩弄 gridSplitter。我的XAML如下:

<UserControl x:Class="MyControl.FieldControl_SelectFrom"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             xmlns:local="clr-namespace:MyControl"
             mc:Ignorable="d" 
             d:DesignWidth="342">
    <Grid  Background="{x:Static SystemColors.ControlBrush}">
        <Grid.RowDefinitions>
            <RowDefinition Height="*"></RowDefinition>
            <RowDefinition Height="*"></RowDefinition>
            <RowDefinition Height="auto"></RowDefinition>
            <RowDefinition Height="*"></RowDefinition>
        </Grid.RowDefinitions>
        <TextBlock Grid.Row="0" x:Name="textBlock_fieldName" HorizontalAlignment="Left" Margin="20,4,0,0" TextWrapping="Wrap" Text="FieldName" VerticalAlignment="Top" FontWeight="Bold"/>
        <ListBox Grid.Row="1" x:Name="selectorBox" MinHeight="80" Height="auto" VerticalAlignment="Stretch" HorizontalAlignment="Stretch" Padding="0,0,0,0"  Margin="20,4,38,4" VerticalContentAlignment="Center" />
        <GridSplitter Grid.Row="2" Height="2" VerticalAlignment="Center"></GridSplitter>
        <TextBlock Grid.Row="3" x:Name="textBlock_fieldInfo" HorizontalAlignment="Left" Margin="20,0,0,6" TextWrapping="Wrap"  VerticalAlignment="Bottom" FontStyle="Italic" Foreground="Gray">Field Info</TextBlock>

    </Grid>
</UserControl>

当我 运行 项目时,列表框会展开以显示全部内容 - 无法调整大小。

我错过了什么?

GridSplitter 的默认调整方向是GridResizeDirection.Auto。如果您查看 GridResizeDirection.Auto 的文档,了解有关 Auto 行为的规则,您会注意到在您的情况下,GridSplitter —— 基于所解释的定义规则在文档中——实际上是在尝试调整列之间的大小,而不是您想要的行。

您可以通过两种基本方式使 GridSplitter 在行模式下工作。一种是将 GridSplitter 的 ResizeDirection 显式设置为 GridResizeDirection.Rows。但是,这并不能完全解决您问题中给出的代码的问题。

因为,如果不指定拆分器的宽度或让它水平拉伸(您都没有这样做),拆分器仍然是 point-like 或较短的垂直 line-like 元素,宽度为几乎不可能击中的零。所以,基本上你可以告诉拆分器水平拉伸,这将使默认的 Auto 调整大小方向在行模式下运行(因此不需要设置 ResizeDirection 属性 显式)以及给拆分器一个实际可以 hit/grabbed 鼠标指针的大小。