我有一个ListBox,它的ItemTemplate绑定到DataTemplate。我的问题是我无法将模板中的元素拉伸到ListBox的整个宽度。
<ListBox x:Name="listPeople" VerticalAlignment="Stretch" HorizontalAlignment="Stretch"
Margin="0,0,0,0" Background="{x:Null}" SelectionMode="Extended" Grid.Row="1"
ItemTemplate="{StaticResource PersonViewModel.BrowserDataTemplate}"
ItemsSource="{Binding Mode=OneWay, Path=SearchResults}" >
</ListBox>
<DataTemplate x:Key="PersonViewModel.BrowserDataTemplate">
<ListBoxItem HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
<Grid HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Margin="5,5,5,5">
<Border Opacity=".1" x:Name="itemBorder" Background="#FF000000"
HorizontalAlignment="Stretch" VerticalAlignment="Stretch"
CornerRadius="5,5,5,5" MinWidth="100" Height="50"/>
</Grid>
</ListBoxItem>
</DataTemplate>
如您所见,我在网格中添加了一个边框以指示模板的宽度。我的目标是看到此边框扩展到列表框的整个宽度。目前它的宽度是由它的内容或MinWidth决定的,这是目前保持可见的唯一内容。
答案 0 :(得分:67)
我花了一个小时试图解决这个问题。非常非常令人沮丧。您不必须覆盖ListBoxItem的整个默认样式。我无法让这个工作。最后,我通过简单地覆盖 ListBox.ItemContainerStyle 部分中的 HorizontalContentAlignment 属性解决了这个问题,例如:
<ListBox x:Name="ClassList" ItemsSource="{Binding LineClasses}"
ScrollViewer.VerticalScrollBarVisibility="Visible"
SelectionMode="Extended"
ScrollViewer.HorizontalScrollBarVisibility="Hidden" HorizontalContentAlignment="Stretch"
HorizontalAlignment="Stretch" Loaded="ClassList_Loaded"
VerticalAlignment="Stretch" Grid.Row="0">
<ListBox.ItemContainerStyle>
<Style TargetType="ListBoxItem">
<Setter Property="HorizontalContentAlignment" Value="Stretch"></Setter>
</Style>
</ListBox.ItemContainerStyle>
<ListBox.ItemTemplate>
<DataTemplate>
<Border BorderBrush="Black" CornerRadius="3" Background="#FFE88D34"
BorderThickness="1" HorizontalAlignment="Stretch" >
<Grid Background="Transparent" HorizontalAlignment="Stretch" >
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<TextBlock
Grid.Column="0" HorizontalAlignment="Stretch"
Margin="2"
FontSize="10"
Text="{Binding DisplayClassNm}"/>
</Grid>
</Border>
</DataTemplate>
</ListBox.ItemTemplate>
这对我有用。
迈尔斯
答案 1 :(得分:29)
为ListBox创建数据模板时,不应该使用<ListBoxItem>
。 DataTemplate的内容将放在生成的容器中。您可以使用ItemContainerStyle控制该容器的构造方式。
ListBoxItem的默认控件样式默认用于定义ItemContainerStyle。此样式将ListBoxItem.HorizontalContentAlignment属性设置为“Left”。注意ContentPresenter如何将其HorizontalAlignment绑定到此属性。
您需要覆盖绑定到ListBox时生成的ListBoxItem容器的样式。这可以通过设置ItemContainerStyle来完成。将HorizontalContentAlignment属性设置为“Stretch”。
以下是默认的ListBoxItem样式。包括在内供参考。
<Style x:Key="ListBoxItemStyle1" TargetType="ListBoxItem">
<Setter Property="Padding" Value="3"/>
<Setter Property="HorizontalContentAlignment" Value="Left"/>
<Setter Property="VerticalContentAlignment" Value="Top"/>
<Setter Property="Background" Value="Transparent"/>
<Setter Property="BorderThickness" Value="1"/>
<Setter Property="TabNavigation" Value="Local"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="ListBoxItem">
<Grid Background="{TemplateBinding Background}">
<!-- VSM excluded for readability -->
<Rectangle x:Name="fillColor" Fill="#FFBADDE9" RadiusX="1" RadiusY="1" IsHitTestVisible="False" Opacity="0"/>
<Rectangle x:Name="fillColor2" Fill="#FFBADDE9" RadiusX="1" RadiusY="1" IsHitTestVisible="False" Opacity="0"/>
<ContentPresenter x:Name="contentPresenter" HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" Margin="{TemplateBinding Padding}" Content="{TemplateBinding Content}" ContentTemplate="{TemplateBinding ContentTemplate}"/>
<Rectangle x:Name="FocusVisualElement" Stroke="#FF6DBDD1" StrokeThickness="1" RadiusX="1" RadiusY="1" Visibility="Collapsed"/>
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
答案 2 :(得分:1)
Here是使用控件模板和数据模板进行列表框控件的示例。请参阅XAML标记,该标记用于对列表框项目进行边界处理。
答案 3 :(得分:0)
我的ListBoxItem包含一个CheckBox,上面的解决方案对我不起作用(很可能是由于CheckBox的性质,而不是那些解决方案)我能够通过不绑定到“Content”属性来强制实现此功能。复选框,但明确定义XAML内联:
<CheckBox HorizontalAlignment="Stretch" IsChecked="{Binding Path=IsSelected, Mode=TwoWay}">
<TextBlock
MinWidth="130"
Margin="0,-2,0,0"
HorizontalAlignment="Stretch"
Text="{Binding Path=DisplayText}" />
</CheckBox>
需要边距,因为TextBox文本未与CheckBox的复选标记对齐。 MinWidth也是必要的。
答案 4 :(得分:0)
我正在与VS 2012一起使用Silverlight 5.我遇到了同样的问题。我有自己的自定义对象作为ItemsSource的水平列表框。我想要扩展列表框项目。但他们并没有扩大。我不想为每个列表框项目提供任何硬编码宽度。我在这里尝试了所有答案但没有任何效果我刚给了ItemsSource = {Binding Persons} DisplayMemberPath =“First Name”。多数民众赞成
答案 5 :(得分:-1)
我在这里注意到两件事,因为我遇到了同样的问题而无法按照你的方式解决问题。
首先,您不需要在DataTemplate中显式放置ListBoxItem。这是为您自动创建的,因此您实际上将ListBoxItem放在为您创建的ListBoxItem中。我在Snoop中进行了检查以确认。
其次,我不确切知道为什么,但我也无法从对齐属性中获得拉伸行为。我将其更改为使用Width属性上的RelativeSource绑定到包含ListBoxItem的ActualWidth属性。这对我有用。
Width="{Binding RelativeSource={RelativeSource
AncestorType={x:Type ListBoxItem}}, Path=ActualWidth}"
如果需要在为您隐式创建的ListBoxItem上设置样式属性,请使用ListBox.ItemContainerStyle元素内的Style元素。
希望这会有所帮助......