2010-09-04 82 views
2

我需要你的帮助! :-)嵌套列表框大小问题

看看这个代码示例:

<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> 

现在,当我运行它,然后单击“Enter”键在RichTextBoxes之一/“返回”,外部列表框项目(例如X: NAME =项目1)延伸,以匹配新的大小 - 但是当我删除新添加的行不会调整回原来的大小...

感谢名单, 吉利

回答

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增长到所需的高度,这意味着它将始终显示其所有行。