嵌套ListBox大小调整问题

时间:2010-09-04 18:55:45

标签: wpf

我需要你的帮助! : - )

查看此代码示例:

    <ListBox VerticalAlignment="Stretch" HorizontalAlignment="Stretch" Width="500">
        <ListBox x:Name="Item1" VerticalAlignment="Stretch" HorizontalAlignment="Stretch" Width="300" BorderBrush="Red" BorderThickness="5">
            <ListBox.Items>
                <RichTextBox VerticalAlignment="Stretch" HorizontalAlignment="Stretch" Width="300" SizeChanged="OnInnserItemSizeChanged"/>
                <RichTextBox VerticalAlignment="Stretch" HorizontalAlignment="Stretch" Width="300"/>
                <RichTextBox VerticalAlignment="Stretch" HorizontalAlignment="Stretch" Width="300"/>
            </ListBox.Items>
        </ListBox>
        <ListBox x:Name="Item2" BorderBrush="Green" BorderThickness="5" Width="300" VerticalAlignment="Stretch" HorizontalAlignment="Stretch">
            <ListBox.Items>
                <RichTextBox VerticalAlignment="Stretch" HorizontalAlignment="Stretch" Width="300"/>
                <RichTextBox VerticalAlignment="Stretch" HorizontalAlignment="Stretch" Width="300"/>
                <RichTextBox VerticalAlignment="Stretch" HorizontalAlignment="Stretch" Width="300"/>
            </ListBox.Items>
        </ListBox>            
    </ListBox>

现在,当我运行它并在其中一个RichTextBox中单击“Enter”/“Return”时,外部列表框项(例如x:Name = Item1)会拉伸以匹配新的大小 - 但是当我删除新的添加了行,它不会调整回原来的大小......

感谢名单, 吉利

1 个答案:

答案 0 :(得分:4)

这是由VirtualizingStackPanel处理滚动的方式引起的,虽然我不知道它背后的原因。您可以使用常规StackPanel作为ItemsPanel而不是VirtualizingStackPanel来阻止它:

<ListBox x:Name="Item1" VerticalAlignment="Stretch" HorizontalAlignment="Stretch"
         Width="300" BorderBrush="Red" BorderThickness="5">
    <ListBox.ItemsPanel>
        <ItemsPanelTemplate>
            <StackPanel/>
        </ItemsPanelTemplate>
    </ListBox.ItemsPanel>

或通过将ScrollViewer.CanContentScroll设置为False来阻止VirtualizingStackPanel处理滚动:

<ListBox x:Name="Item1" VerticalAlignment="Stretch" HorizontalAlignment="Stretch"
         Width="300" BorderBrush="Red" BorderThickness="5"
         ScrollViewer.CanContentScroll="False">

请注意,执行其中任何一项都会导致您丢失内部ListBox中的虚拟化。在这种情况下,你无论如何都没有利用它,因为外部ListBox有一个ScrollViewer,可以让内部ListBox增长到它想要的高度,这意味着它将始终显示它的所有行。