我有一个使用自定义 ScrollViewer 的 ListBox(在 windows xp 嵌入式触摸屏上提供虚假的“触摸”滚动体验)
<ControlTemplate TargetType="{x:Type auc:DragSortableListView}">
<auc:DragScrollViewer ...>
<ItemsPresenter .../>
</auc:DragScrollViewer>
</ControlTemplate>
在那个“DragScrollViewer”中,我使用 IScrollInfo-Interface 来执行效果很好的滚动。
另外,我使用 UI 虚拟化是因为我们有大量数据绑定到列表视图,并且滚动(当虚拟化打开时)发生的不是基于像素,而是基于索引,正如我发现的那样。这意味着如果我通过 IScrollInfo 滚动到垂直偏移 5,它会滚动到第 5 项。
我的问题是,我不知道如何将基于像素的鼠标偏移量(当用户将“鼠标”移动 50 像素时)转换为 IScrollInfo.SetVerticalOffset() 期望的基于项目计数的偏移量(偏移量有是 3,一个项目是 10 像素 => 将偏移设置为 8)。如果我知道 Item-Height 会很容易,但我在 ScrollViewer 中。ScrollViewer 怎么可能知道在可视化树下是否有 ItemsPresenter,对吧?如果物品有不同的高度(不是这种情况,而是假设)怎么办?
有关如何解决该问题的任何建议?