【问题标题】:WPF Custom ScrollViewer - ItemHeight when VirtualizingWPF 自定义 ScrollViewer - 虚拟化时的 ItemHeight
【发布时间】:2013-02-13 10:23:53
【问题描述】:

我有一个使用自定义 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,对吧?如果项目的高度不同(不是这种情况,而是假设)怎么办?

关于如何解决这个问题的任何建议?

【问题讨论】:

    标签: wpf scrollviewer


    【解决方案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 实现。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多