使用VirtualizingStackPanel在ItemsControl中进行精确的滚动条控制

时间:2017-08-25 17:25:10

标签: c# scroll uwp itemscontrol virtualizingstackpanel

我有一个使用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;底部也是如此),我该怎么办?亲近,自然而然地)?

1 个答案:

答案 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]