我有一个使用VirtualizingStackPanel的Itemscontrol来显示一个巨大的(并且不断增长的)项目列表:
s.rb
虚拟化就像一个魅力,但我无法正确管理滚动条。如果我尝试以编程方式(例如在加载时)滚动到底部,就像我在非虚拟化StackPanels中一样:
<ItemsControl Grid.Row="1" Name="ConversationItemsControl" VirtualizingStackPanel.VirtualizationMode="Recycling">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<VirtualizingStackPanel Orientation="Vertical" />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.Template>
<ControlTemplate TargetType="ItemsControl">
<ScrollViewer>
<ItemsPresenter />
</ScrollViewer>
</ControlTemplate>
</ItemsControl.Template>
<ItemsControl.ItemTemplate>
<DataTemplate>
<local:Message />
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
scrollviewer尝试滚动到底部,但不会完全滚动 - 它总是在&#34; real&#34;之前停止一点。底部。这在某种程度上是有道理的,因为VirtualizingStackPanels正在使用滚动值来确定要渲染的项目,但它完全磨损我的齿轮并且对最终用户来说是不可接受的。
如何滚动到&#34;真实&#34;底部?如果我想向完全滚动到目前为止某个项目的顶部位于视口的顶部(除非&#34;真实&#34;底部也是如此),我该怎么办?亲近,自然而然地)?
答案 0 :(得分:1)
这是因为内置的ItemsControl类不支持虚拟化。您可以尝试使用ListBox,默认情况下使用UI虚拟化。
如果您不想选择行为,只需设置:
<ListBox x:Name="lbCustom">
<ListBox.ItemContainerStyle>
<Style TargetType="ListBoxItem">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="ListBoxItem">
<ContentPresenter/>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</ListBox.ItemContainerStyle>
</ListBox>
然后像:
lbCustom.ScrollIntoView(lbCustom.Items[lbCustom.Items.Count - 1]