WrapPanel в ListBox с HorizontalContentAlignment = "Растянуть" неправильно упаковывать - PullRequest
0 голосов
/ 27 января 2019

Я пытаюсь сделать что-то похожее на 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":

Strange ListBox behavior

А затем правильное / ожидаемое поведение при HorizontalContentAlignment="Left"

Correct ListBox behavior

Я что-то не так делаю? Мне кажется, что это ошибка в WPF…

...