Вопрос по wpf, .net – Как сделать DockPanel заполнить доступное пространство

18

Я пробую содержимое корзины в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   ответа
27

Связать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>
Я нашел твой второй подход и пошел по этому пути. Richard McGuire
Я пытался использовать эту привязку, и кажется, что ListBoxItem постоянно увеличивался в размерах, при просмотре с помощью Snoop я увидел, что ширина ListBoxItem и DockPanel превышает 300 000. Richard McGuire
Второй подход работает, если вы используете HorizontalContentAlignment вместо HorizontalAlignment. Я отредактировал ответ. slfan
О, хорошо, я понял ... вы должны установить LastChildFill = "False" на панели DockPanel, в противном случае второй TextBlock растягивается Thomas Levesque
Попробуйте привязку к ActualWidth самого ListBox, затем ... Thomas Levesque
6

что панели док-станции уже занимают все доступное пространство. 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>
4

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

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

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

Я не думаю, что DockPanels - это зло, иногда они могут быть очень полезны ... однако я должен согласиться с тем, что в этом случае это, вероятно, не самая лучшая вещь Thomas Levesque
Конечно, это субъективно, и они не являются Абсолютный зло;) Но посмотрите, куда Рич уже идет - используя ItemContainerStyle (полу-продвинутый материал) для простой задачи - довольно показательно ... Sergey Aldoukhov
Я с самого начала рассматривал Grid. Однако, учитывая узкий ListBox или достаточно длинное значение для свойств Name или Price, два TextBlocks в конечном итоге будут перекрывать свои значения. Кроме того, я бы вряд ли классифицировал размещение двух TextBlocks на противоположных концах панели как «сложное расположение». Richard McGuire
Извините за комментирование этого старого поста, но использование сетки также является простым и не менее эффективным решением проблемы. Проблему перекрытия можно избежать. + 1 code4life
@ code4life как этого избежать? GorillaApe

Похожие вопросы