如何使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"(其他都是默认的" *"),然后将" HorizontalAlignment =" Left"`放在WrapPanel上,并将HorizontalAlignment =" 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
,则需要将ColumnDefinition
s更改为:
<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"上。