Я пытаюсь сделать что-то похожее на this : у меня есть ListBox
, где каждый ListBoxItem
состоит из числа TextBlock
с (конкретно семь, но точное число не является ' важно). Я хочу, чтобы TextBlock
были расположены горизонтально, но если места недостаточно, перенеситесь в новый ряд. И я хочу, чтобы первые TextBlock
s в каждом ListBoxItem
имели одинаковую ширину, вторые TextBlock
s в каждом 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
s появляется больше пустого пространства, но они фактически никогда не помещаются в это пространство. Но если я затем прокручиваю ListBox
вниз, в какой-то момент эти TextBlock
внезапно появятся. И если я прокручиваю назад, они выкладываются, как и ожидалось.
Вот несколько анимированных скриншотов, которые показывают, что я имею в виду. Во-первых, странное поведение, когда HorizontalContentAlignment="Stretch"
:
А затем правильное / ожидаемое поведение при HorizontalContentAlignment="Left"
Я что-то не так делаю? Мне кажется, что это ошибка в WPF…