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

标签 wpf scrollviewer

我有一个使用自定义 ScrollViewer 的 ListBox(在 windows xp 嵌入式触摸屏上提供虚假的“触摸”滚动体验)

<ControlTemplate TargetType="{x:Type auc:DragSortableListView}">
    <auc:DragScrollViewer ...>
        <ItemsPresenter .../>
    </auc:DragScrollViewer>
</ControlTemplate>

在那个“DragScrollViewer”中,我使用 IScrollInfo-Interface 来执行滚动效果很好。

另外,我使用 UI 虚拟化是因为我们有大量数据绑定(bind)到 ListView ,并且滚动(当虚拟化打开时)不是基于像素的,而是基于索引的,正如我所想的那样。这意味着如果我通过 IScrollInfo 滚动到垂直偏移量 5,它会滚动到第 5 个项目。

我的问题是,我不知道如何将基于像素的鼠标偏移量(当用户将“鼠标”移动 50 像素时)转换为 IScrollInfo.SetVerticalOffset() 期望的基于项目计数的偏移量(偏移量一直是 3,一个项目是 10 像素 => 将偏移量设置为 8)。如果我知道 Item-Height 会很容易,但我在 ScrollViewer 中。 ScrollViewer 怎么可能知道可视化树下是否有 ItemsPresenter,对吗?如果元素的高度不同(实际情况并非如此,但只是假设)怎么办?

关于如何解决这个问题有什么建议吗?

最佳答案

你看过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 实现。

关于WPF 自定义 ScrollViewer - 虚拟化时的 ItemHeight,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14851311/

相关文章:

c# - 允许鼠标事件通过半透明的 Popup

WPF 列表框不会垂直滚动

windows-phone-7 - ListBox的ControlTemplate样式时如何保持虚拟化?

WPF 嵌套滚动查看器 - 将控制权交还给父 scollviewer

c# - PropertyChangedCallback 封装

c# - 从枚举自动生成 DataGrid 列

c# - WPF 自定义文本框控件未正确绑定(bind)文本

c# - 如何根据我的数据库行以编程方式在 C# 中填充 WPF 网格?

c# - ScrollViewer 在没有固定高度的情况下不显示滚动距离

wpf - ScrollViewer WPF 右下角颜色