堆栈面板内可调整大小的 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 鼠标指针的大小。
我正在尝试在 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 鼠标指针的大小。