WPF自定义ScrollViewer - 虚拟化时的ItemHeight

时间:2013-02-13 10:23:54

标签: wpf scrollviewer

我有一个ListBox,它使用自定义ScrollViewer(在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,项目为10pixel =&gt;设置偏移量为8)。如果我知道Item-Height就很容易,但我在ScrollViewer中。 ScrollViewer怎么可能知道在可视树下是否有ItemsPresenter,对吧?如果物品的高度不同(情况并非如此,但假设的话)会怎样?

有关如何解决该问题的任何建议?

1 个答案:

答案 0 :(得分:1)

你看过this article了吗?

我看到它的方式,他将鼠标偏移存储在_Offset中,然后调用InvalidateArrange(),这可能(只是在这里猜测)依次查询VerticalOffset属性并处理适当的滚动。

private Vector _Offset;
public double VerticalOffset  { get { return _Offset.Y; } }

public void SetVerticalOffset(double offset)
{
  offset = Math.Max(0, Math.Min(offset, ExtentHeight - ViewportHeight));
  if (offset != _Offset.Y)
  {
    _Offset.Y = offset;
    InvalidateArrange();
  }
}

我认为这绝不会要求您将像素偏移实际转换为项目计数偏移量。如果这不正确,请提供您的IScrollInfo实现。