ListBoxItem水平内容对齐方式如何才能跨越整个ListBox的宽度?

10

我在Windows Phone 8应用程序中有一个问题,我的ListBoxItem无法跨越整个ListBox的宽度。

我的ListBox

<ListBox 
      ItemsSource="{Binding Events}" 
      behaviors:ItemClickCommandBehavior.Command="{Binding EventSelectedCommand}"
      ItemTemplate="{StaticResource EventListTemplateSelector}"/>

而它的DataTemplates则在一个单独的XAML资源文件中:

<DataTemplate x:Key="EventListHeaderTemplate">
    <Border HorizontalAlignment="Stretch">
        <Grid Height="50">
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="*"/>
                <ColumnDefinition Width="6*"/>
            </Grid.ColumnDefinitions>
            <Image Grid.Column="0" Source="{Binding ImageUri}" VerticalAlignment="Center" HorizontalAlignment="Center" Height="30"/>
            <TextBlock Grid.Column="1" Text="{Binding SomeText}" VerticalAlignment="Center" HorizontalAlignment="Left" Foreground="Black"/>
        </Grid>
    </Border>
</DataTemplate>

我无法让物品真正地拉伸,也不知道问题出在哪里。我尝试过将 ItemContainerStyle 的 HorizontalContentAlignment 设置为 "Stretch",但没有起作用。我尝试了许多其他组合,似乎只有将边框或网格宽度设置为常数才有效,另外一个有效的解决方案是将边框宽度绑定到包含 ListBox 的 ActualWidth 上,但如果可以使其工作,我想使用拉伸变体。


1个回答

27

在XAML中我遇到了相同的问题,一直想知道为什么我的TextBlock没有完全填充整个宽度。

解决竞争样式的方法(实际上适用于任何XAML变体)是显式定义ListBoxItem样式以处理空间使用。

这将给XAML一个提示,即以这种方式填充(伸展)到屏幕区域:

    <ListBox Name="lbTest" HorizontalContentAlignment="Stretch"  >

        <ListBox.ItemContainerStyle>
            <Style TargetType="ListBoxItem">
                <Setter Property="HorizontalContentAlignment"
                        Value="Stretch"/>
            </Style>
        </ListBox.ItemContainerStyle>

        <ListBox.ItemTemplate>...</ListBox.ItemTemplate>
否则,默认情况下,XAML解析器会尝试通过自动调整大小以适应ListBoxItem的内容来节省空间;这会使其看起来像是被胶带粘住了一样。

这是微软犯的一个bug吗?我浪费了三个小时才找到你的帖子。谢谢。 - user1021364
这只是一系列默认样式的链,独立控件中很有意义,但当它们组合在一起时,就会给我们带来这个......欢迎加入发现这种样式彩蛋的俱乐部。;-) - ΩmegaMan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接