WPF边框控件如何跨越整个ListBoxItem的宽度

21

我正在尝试为我的WPF应用程序中的一个业务对象定义一个dataTemplate,它的一个集合被绑定到ListBox上。

<UserControl.Resources>
    <DataTemplate x:Key="ResizedItemsDataTemplate" DataType="{x:Type resizer:ResizeMonitorItem}">
              <Border x:Name="bdr" BorderBrush="Blue" 
                                     BorderThickness="1" 
                                     CornerRadius="2" 
                                     Width="auto"
                                     HorizontalAlignment="Stretch"
                                     VerticalAlignment="Stretch">
                    <Grid Margin="2">
                        <Grid.RowDefinitions>
                            <RowDefinition Height="14"></RowDefinition>
                            <RowDefinition Height="14"></RowDefinition>
                        </Grid.RowDefinitions>


                        <TextBlock Grid.Row="0" Text="{Binding SaveAsFileName}"></TextBlock>
                        <TextBlock Grid.Row="1" Text="{Binding ResizedImageFilePath}"></TextBlock>
                    </Grid>
             </Border>
    </DataTemplate>
</UserControl.Resources>
<Grid VerticalAlignment="Stretch" HorizontalAlignment="Stretch" Margin="0">    
    <Border BorderThickness="0,0,0,5" BorderBrush="DarkGray" >
        <ListBox x:Name="ListBoxResizeItems" ItemsSource="{Binding Path=ResizeItems}" BorderThickness="0" ItemTemplate="{DynamicResource ResizedItemsDataTemplate}">
        </ListBox>
    </Border>
</Grid>

如何使使用x:Name=bdr定义的边框跨越整个列表框项目的宽度?目前,它只覆盖其中的文本块的宽度,这些文本块不一定填满列表框项目的整个宽度,并且对于每个列表框项目也不同。

3个回答

56

这可能与ListBoxItems本身未占据整个ListBox宽度有关。请在ListBox上添加 HorizontalContentAlignment="Stretch" 属性,看看是否能拉伸各个项目以填充宽度。


好的。不知道那个属性。太糟了,默认值是Left而不是Stretch,这导致了这种行为。 - Gishu
Disco,知道那个属性,但对WPF仍然很陌生,这正好满足了我的要求。谢谢! - Dave Jellison

2

HorizontalContentAlignment是一个很好的、干净的解决方案,相比我之前尝试的方法要好得多。谢谢!

以下是几乎奏效的代码,但有时会使对话框动画自己变得越来越宽:

Width="{Binding ActualWidth, 
        RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListBox}}}"

为什么要发布一个“几乎”可行的答案,而不是有一个完全可行的解决方案呢?特别是在问题已经被回答10个月之后...(顺便说一句:我刚刚也做了和你一样的尝试.. :)) - Avada Kedavra

2

已经解决了。诀窍在于将水平对齐设置为“Stretch”,使列表框的内容拉伸到整个宽度而不是仅适应内容。

 <ListBox x:Name="ListBoxResizeItems" 
                HorizontalContentAlignment="Stretch"
                ItemsSource="{Binding Path=ResizeItems}" 
                BorderThickness="0"                                         
                ItemTemplate="{DynamicResource ResizedItemsDataTemplate}" >
        </ListBox>

抱歉,马特,在我打这篇文章的时候收到了你的回答。


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