Как сделать 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 было?

Ответы на вопрос(3)

Решение Вопроса

Связать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>
 Thomas Levesque03 июл. 2009 г., 22:47
О, хорошо, я понял ... вы должны установить LastChildFill = "False" на панели DockPanel, в противном случае второй TextBlock растягивается
 slfan25 апр. 2012 г., 09:41
Второй подход работает, если вы используете HorizontalContentAlignment вместо HorizontalAlignment. Я отредактировал ответ.
 Richard McGuire03 июл. 2009 г., 23:13
Я нашел твой второй подход и пошел по этому пути.
 Richard McGuire03 июл. 2009 г., 21:23
Я пытался использовать эту привязку, и кажется, что ListBoxItem постоянно увеличивался в размерах, при просмотре с помощью Snoop я увидел, что ширина ListBoxItem и DockPanel превышает 300 000.
 Thomas Levesque03 июл. 2009 г., 22:25
Попробуйте привязку к ActualWidth самого ListBox, затем ...

что панели док-станции уже занимают все доступное пространство. LastChildFill имеет значение true по умолчанию (но для ясности я установил его ниже), поэтому просто не устанавливайте атрибут 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>

DockPanel злые Искушение использоватьStackPanel/DockPanel комбинация для сложных макетов приводит к «тупикам макетов». Использовать сетку:

  <TextBlock HorizontalAlignment="Left"
...
  <TextBlock HorizontalAlignment="Right"
...
/Grid>

Я используюGrid почти исключительно, используя отдельную сетку для каждого блока элементов, которые "принадлежат друг другу"

 Thomas Levesque03 июл. 2009 г., 23:18
Я не думаю, что DockPanels - это зло, иногда они могут быть очень полезны ... однако я должен согласиться с тем, что в этом случае это, вероятно, не самая лучшая вещь
 Richard McGuire08 июл. 2009 г., 04:31
Я с самого начала рассматривал Grid. Однако, учитывая узкий ListBox или достаточно длинное значение для свойств Name или Price, два TextBlocks в конечном итоге будут перекрывать свои значения. Кроме того, я бы вряд ли классифицировал размещение двух TextBlocks на противоположных концах панели как «сложное расположение».
 Sergey Aldoukhov03 июл. 2009 г., 23:46
Конечно, это субъективно, и они не являются Абсолютный зло;) Но посмотрите, куда Рич уже идет - используя ItemContainerStyle (полу-продвинутый материал) для простой задачи - довольно показательно ...
 code4life22 июл. 2011 г., 14:51
Извините за комментирование этого старого поста, но использование сетки также является простым и не менее эффективным решением проблемы. Проблему перекрытия можно избежать. + 1
 GorillaApe29 нояб. 2012 г., 03:39
@ code4life как этого избежать?

Ваш ответ на вопрос