Scrollviewer使用itemscontrol进行逻辑滚动

时间:2012-03-02 13:53:04

标签: wpf scroll itemscontrol scrollviewer stackpanel

在WPF应用程序中,我有一个ScrollViewer,其中有一个ItemsControl,其项目可以数据绑定到一个集合,我有一个为这些项目指定的模板。我希望ScrollViewer使用逻辑滚动,因此我设置ScrollViewer.CanContentScroll =“True”标志,并将ItemsControl的ItemsPanel模板设置为StackPanel。

然而,滚动仍然是物理的而不是逻辑的。我做错了什么?

由于 汤姆

1 个答案:

答案 0 :(得分:0)

很抱歉迟到的回复...... 这是微软“添加”到.Net 4.5(基于像素的滚动)的东西。

在WPF 4上,TreeView确实有逻辑滚动,但ListBox和ItemsControl没有。 那怎么会在TreeView上运行而不在ListBox上呢?由于VirtualizingStackPanel正在管理滚动,因此这个问题应该被提出。

嗯,“秘密”在VirtualizingStackPanel的一个名为IsPixelBased的内部属性中。

如果将其设置为true,则会返回逻辑滚动。

然而,这需要付出代价。似乎有一个大的项目源(即使使用虚拟化和容器回收)滚动是缓慢的。 (大项目源是50,000或100,000),而物理(基于项目)滚动则不是。

我希望在WPF 4.5中解决这个问题

以下是默认情况下使用基于像素的滚动的虚拟化标签的示例:

public class VSP : VirtualizingStackPanel
{
    public VSP()
    {
        typeof(VSP).GetProperty("IsPixelBased", BindingFlags.Instance | BindingFlags.NonPublic).SetValue(this, true, null);
    }
}