如何使WPF数据模板填充列表框的整个宽度?

时间:2020-03-06 14:44:34  来源:igfitidea点击:

我在WPF中有一个ListBox``DataTemplate。我想要一个项目紧靠在" ListBox"的左侧,而另一个项目紧靠在右侧,但是我不知道该怎么做。

到目前为止,我有一个带有三列的"网格",左边和右边都有内容,中间是一个占位符,其宽度设置为" *"。我要去哪里错了?

这是代码:

<DataTemplate x:Key="SmallCustomerListItem">
    <Grid HorizontalAlignment="Stretch">
        <Grid.RowDefinitions>
            <RowDefinition/>
        </Grid.RowDefinitions>
        <Grid.ColumnDefinitions>
            <ColumnDefinition/>
            <ColumnDefinition Width="*"/>
            <ColumnDefinition/>
        </Grid.ColumnDefinitions>
        <WrapPanel HorizontalAlignment="Stretch" Margin="0">
            <!--Some content here-->
            <TextBlock Text="{Binding Path=LastName}" TextWrapping="Wrap" FontSize="24"/>
            <TextBlock Text=", " TextWrapping="Wrap" FontSize="24"/>
            <TextBlock Text="{Binding Path=FirstName}" TextWrapping="Wrap" FontSize="24"/>

        </WrapPanel>
        <ListBox ItemsSource="{Binding Path=PhoneNumbers}" Grid.Column="2" d:DesignWidth="100" d:DesignHeight="50"
     Margin="8,0" Background="Transparent" BorderBrush="Transparent" IsHitTestVisible="False" HorizontalAlignment="Stretch"/>
    </Grid>
</DataTemplate>

解决方案

默认情况下,"网格"应该占据"列表框"的整个宽度,因为默认的" ItemsPanel"是" VirtualizingStackPanel"。我假设我们尚未更改ListBox.ItemsPanel

也许,如果我们摆脱了中间的" ColumnDefinition"(其他都是默认的" *"),然后将" Horizo​​ntalAlignment =" Left"`放在WrapPanel上,并将Horizo​​ntalAlignment =" Right"放在ListBox上。电话号码。我们可能需要稍微修改一下" ListBox",以使电话号码更加右对齐,例如为它们创建一个" DataTemplate"。

好的,这就是你所拥有的:

列0:WrapPanel
专栏1:一无所有
第2栏:ListBox

听起来好像我们想在左边缘使用" WrapPanel",在右边缘使用" ListBox",并留出空间来容纳中间的内容。

实际上,最简单的方法是使用" DockPanel"而不是" Grid"。

<DockPanel>
    <WrapPanel DockPanel.Dock="Left"></WrapPanel>
    <ListBox DockPanel.Dock="Right"></ListBox>
</DockPanel>

这应该在WrapPanel和ListBox之间留出空白。

如果要使用Grid,则需要将ColumnDefinitions更改为:

<Grid.ColumnDefinitions>
        <ColumnDefinition Width="Auto"/>
        <ColumnDefinition Width="*"/>
        <ColumnDefinition Width="Auto"/>
    </Grid.ColumnDefinitions>

如果不需要使用"网格",则可以使用" DockPanel":

<DockPanel>
        <WrapPanel DockPanel.Dock="Left">
            <!--Some content here-->
            <TextBlock Text="{Binding Path=LastName}" TextWrapping="Wrap" FontSize="24"/>
            <TextBlock Text=", " TextWrapping="Wrap" FontSize="24"/>
            <TextBlock Text="{Binding Path=FirstName}" TextWrapping="Wrap" FontSize="24"/>
        </WrapPanel>
        <ListBox DockPanel.Dock="Right" ItemsSource="{Binding Path=PhoneNumbers}" 
 Margin="8,0" Background="Transparent" BorderBrush="Transparent" IsHitTestVisible="False"/>
        <TextBlock />
    </DockPanel>

注意最后的" TextBlock"。没有定义" DockPanel.Dock"的任何控件将填充剩余的空间。

我还必须设置:

HorizontalContentAlignment="Stretch"

在包含的" ListBox"上。