如何使DockPanel中填充可用空间(How to make DockPanel fill ava

2019-06-24 23:03发布

我想的购物车中的内容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是?

Answer 1:

绑定Width的的DockPanelActualWidth中的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>


Answer 2:

关于码头面板的好处是,他们已经填补所有可用空间。 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>


Answer 3:

DockPanel s为邪恶。 诱惑使用StackPanel/DockPanel进行复杂的布局组合导致“布局死角”。 使用网格:

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

我用Grid差不多排他地,使用一个单独的网格元件的每个块“属于彼此”



文章来源: How to make DockPanel fill available space