【问题标题】:Scrollviewer logical scrolling with itemscontrolScrollviewer 使用 itemscontrol 进行逻辑滚动
【发布时间】:2012-03-02 13:53:03
【问题描述】:

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

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

谢谢 汤姆

【问题讨论】:

  • 通过“物理而不是逻辑”,您是否使用“逻辑”来指代 UI 虚拟化?如果你,你可能对这个问题感兴趣:Virtualizing an ItemsControl

标签: wpf scroll itemscontrol scrollviewer stackpanel


【解决方案1】:

抱歉回复晚了... 这是微软在 .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);
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-20
    相关资源
    最近更新 更多