ListBox中的WrapPanel与Horizo​​ntalContentAlignment =“ Stretch”不能正确包装

时间:2019-01-27 07:00:48

标签: wpf xaml layout wrappanel

我正在尝试做类似于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"时的奇怪行为:

Strange ListBox behavior

然后是HorizontalContentAlignment="Left"

时的正确/预期行为

Correct ListBox behavior

我做错什么了吗?对我来说,这似乎是WPF中的一个错误……

0 个答案:

没有答案