Как сделать StackPanel или DockPanel растягиваться в соответствии с их контейнерами в WPF?

У меня есть Grid как корневой контейнер с двумя определенными столбцами (там только одна строка).
Первый столбец имеет гибкую ширину, а второй столбец имеет фиксированную ширину 300 пикселей.
Затем я поместил 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" />

У меня есть два вопроса:

  • Как мне сделать StackPanel заполнить всю ширину ListBox? Прямо сейчас для размещения DockPanel и TextBlock внутри достаточно места достаточно. Он не будет соответствовать ширине ListBox или ListBoxItem.
  • Далее, как мне сделать DockPanel заполнить всю ширину StackPanel, т.е. ее родителя? Что происходит прямо сейчас, так это то, что даже если ширина TextBlock в StackPanel превышает ширину DockPanel, она не будет растягиваться, чтобы соответствовать их ширине.

Спасибо за помощь.

Ответы

Ответ 1

Содержимое каждого растягивания ListBoxItem можно установить, установив HorizontalContentAlignment в ItemContainerStyle

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