我正在尝试做类似于this的事情:我有一个ListBox
,其中每个ListBoxItem
由许多TextBlock
组成(特别是七个确切数字并不重要)。我希望将TextBlock
放置在水平位置,但是如果没有足够的空间,请换一个新行。我希望每个TextBlock
中的第一个ListBoxItem
共享相同的宽度,每个TextBlock
中的第二个ListBoxItem
共享相同的宽度,等等。
所以这很完美:
<Window x:Class="WpfApplication1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:sys="clr-namespace:System;assembly=mscorlib"
Title="MainWindow" Height="350" Width="525">
<Window.Resources>
<x:Array Type="sys:String" x:Key="MyList">
<sys:String>1</sys:String>
<sys:String>2</sys:String>
<sys:String>3</sys:String>
<sys:String>4</sys:String>
<sys:String>5</sys:String>
<sys:String>6</sys:String>
<sys:String>7</sys:String>
<sys:String>8</sys:String>
<sys:String>9</sys:String>
<sys:String>10</sys:String>
<sys:String>11</sys:String>
</x:Array>
</Window.Resources>
<ListBox Grid.IsSharedSizeScope="True"
ItemsSource="{StaticResource MyList}"
ScrollViewer.HorizontalScrollBarVisibility="Disabled"
HorizontalContentAlignment="Left">
<ListBox.ItemTemplate>
<DataTemplate>
<WrapPanel>
<WrapPanel.Resources>
<Style TargetType="TextBlock">
<Setter Property="Margin" Value="5"/>
</Style>
</WrapPanel.Resources>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition SharedSizeGroup="A"/>
</Grid.ColumnDefinitions>
<TextBlock Text="{Binding}"/>
</Grid>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition SharedSizeGroup="B"/>
</Grid.ColumnDefinitions>
<TextBlock>Column number 2</TextBlock>
</Grid>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition SharedSizeGroup="C"/>
</Grid.ColumnDefinitions>
<TextBlock>Third column</TextBlock>
</Grid>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition SharedSizeGroup="D"/>
</Grid.ColumnDefinitions>
<TextBlock>Column four</TextBlock>
</Grid>
</WrapPanel>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
</Window>
但是,上面的示例大大简化了;我的实际XAML在ListBox
中还有其他要求,它们必须具有HorizontalContentAlignment="Stretch"
。如果设置了该值,则在减小窗口宽度时布局的行为会很奇怪。当它变得足够狭窄以至于“第四列” TextBlock
将不再适合并且需要换行到下一行时,ListBoxItem
的高度会增加以为新行腾出空间,但是“第四列”实际上并没有移到那儿。 ListBoxItem
的底部只有空白。而且,随着我不断缩小窗口宽度,TextBlock
出现了更多的空白,但实际上它们从未放到该空间中。但是,如果我随后向下滚动ListBox
,在某个时刻,那些TextBlock
将会突然出现。而且,如果我向上滚动,它们将按预期布置。
以下是一些动画截图,显示了我的意思。首先,HorizontalContentAlignment="Stretch"
时的奇怪行为:
然后是HorizontalContentAlignment="Left"
我做错什么了吗?对我来说,这似乎是WPF中的一个错误……