如何使WPF中的StackPanel或DockPanel自适应其容器大小?

15

我有一个Grid作为根容器,其中定义了两列(只有一行)。第一列宽度灵活,第二列宽度固定为300px。
接下来,在第二列中放置了一个ListBox,以水平和垂直方向拉伸,即填充整个第二列。
最后,我为ListBox定义了一个项目模板,是一个纵向排列的StackPanel,里面有一个DockPanel和几个TextBlock

<!-- Data template for ListBox -->
<DataTemplate DataType="{x:Type entities:Track}">
  <StackPanel Orientation="Vertical">
    <DockPanel>
      <TextBlock DockPanel.Dock="Left" Text="Now playing" />
      <TextBlock DockPanel.Dock="Right" Text="Time remaining" />
    </DockPanel>
    <TextBlock Text="{Binding Artist}" />
    <TextBlock Text="{Binding Title}" />
  </StackPanel>
</DataTemplate>

...

<ListBox 
  Grid.Column="1" 
  HorizontalAlignment="Stretch" 
  VerticalAlignment="Stretch" />

我有两个问题:

  1. 如何让 StackPanel 填满整个 ListBox 的宽度?目前,它只占用足够的空间来容纳 DockPanel 和内部的 TextBlock。它不会适应 ListBox 或者 ListBoxItem 的宽度。
  2. 接下来,如何让 DockPanel 填满其父级 StackPanel 的整个宽度?当前情况是,即使 StackPanel 中的 TextBlock 的宽度超过了 DockPanel 的宽度,它也不会拉伸以匹配它们的宽度。

感谢您的帮助。

1个回答

24

通过在ItemContainerStyle中设置HorizontalContentAlignment,您可以使每个ListBoxItem的内容都拉伸。

<ListBox ...>
    <ListBox.ItemContainerStyle>
        <Style TargetType="ListBoxItem">
            <Setter Property="HorizontalContentAlignment" Value="Stretch"/>
        </Style>
    </ListBox.ItemContainerStyle>

谢谢你,Meleak。那解决了第一个问题。请问你知道如何让 DockPanel 拉伸以适应 StackPanel 的宽度吗? - Boris
@Boris:我认为它已经实现了。我将你的DataTemplate粘贴到一个示例应用程序中,并使用Snoop进行了检查,它似乎可以拉伸。尝试为DockPanel设置背景,例如<DockPanel Background="Red">。它是否可以拉伸?你的问题可能是TextBlock也在拉伸,尝试为第二个TextBlock设置HorizontalAlignment="Right" - Fredrik Hedblad
我刚刚意识到,除非我有一个占据面板中央区域的元素,否则DockPanel不会拉伸。对我来说,这有点荒谬,因为在我的情况下,我只有左右两个元素。你知道有什么解决方法(除了在DockPanel的中心区域放置虚拟元素),或者你有任何其他建议,可以替代DockPanel以实现相同的效果吗?谢谢。 - Boris
我的错,你设置 HorizontalAlignment="Right" 的技巧解决了这个问题。非常感谢你的帮助。问题已解决! - Boris

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接