在WPF应用程序中,我有一个ScrollViewer,其中有一个ItemsControl,其项目可以数据绑定到一个集合,我有一个为这些项目指定的模板。我希望ScrollViewer使用逻辑滚动,因此我设置ScrollViewer.CanContentScroll =“True”标志,并将ItemsControl的ItemsPanel模板设置为StackPanel。
然而,滚动仍然是物理的而不是逻辑的。我做错了什么?
由于 汤姆
答案 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);
}
}