Как сделать доступным пространство для DockPanel
Я пробую содержимое корзины покупок в ItemsControl(ListBox)
. Для этого я создал следующий DataTemplate
:
<DataTemplate x:Key="Templates.ShoppingCartProduct"
DataType="{x:Type viewModel:ProductViewModel}">
<DockPanel HorizontalAlignment="Stretch">
<TextBlock DockPanel.Dock="Left"
Text="{Binding Path=Name}"
FontSize="10"
Foreground="Black" />
<TextBlock DockPanel.Dock="Right"
Text="{Binding Path=Price, StringFormat=\{0:C\}}"
FontSize="10"
Foreground="Black" />
</DockPanel>
</DataTemplate>
Когда элементы отображаются в моей корзине, однако, имя и цена TextBlocks
сидят рядом друг с другом, и с правой стороны имеется очень большое количество пробелов.
Интересно, какой лучший способ заставить DockPanel
растягиваться, чтобы заполнить все пространство, доступное для ListItem
, было?
Ответы
Ответ 1
Привяжите Width
к DockPanel
к ActualWidth
ListBoxItem
:
<DockPanel Width="{Binding ActualWidth, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListBoxItem}}}">
...
Другой вариант: вы можете просто переопределить ItemContainerStyle
так, чтобы ListBoxItem
растягивался горизонтально:
<ListBox.ItemContainerStyle>
<Style TargetType="ListBoxItem">
<Setter Property="HorizontalContentAlignment" Value="Stretch"/>
</Style>
</ListBox.ItemContainerStyle>
Ответ 2
DockPanel
являются злыми. Искушение использовать комбинацию StackPanel/DockPanel
для сложных макетов приводит к "тупикам макета". Используйте сетку:
<Grid>
<TextBlock HorizontalAlignment="Left"
...
<TextBlock HorizontalAlignment="Right"
...
/Grid>
Я использую Grid
почти исключительно, используя отдельную сетку для каждого блока элементов, которые "принадлежат друг другу"
Ответ 3
Хорошая вещь о док-панелях - они уже заполняют все доступное пространство. LastChildFill по умолчанию является истинным (но я устанавливаю его ниже для ясности), поэтому просто не устанавливайте атрибут DockPanel для последнего дочернего элемента и он заполняет доступное пространство.
<DockPanel HorizontalAlignment="Stretch" LastChildFill="true">
<TextBlock DockPanel.Dock="Left"
Text="{Binding Path=Name}"
FontSize="10"
Foreground="Black" />
<TextBlock
Text="{Binding Path=Price, StringFormat=\{0:C\}}"
FontSize="10"
Foreground="Black" />
</DockPanel>