如何确定项目何时滚动到视图中

本文关键字:视图 滚动 何时 何确定 项目 | 更新日期: 2023-09-27 17:58:43

我想在WPF中开发一个简单的邮件客户端。在任何邮件客户端中,窗口的一部分都是消息列表。Outlook或Thunderbird等桌面客户端的通常行为是,在设置帐户后立即下载收件箱文件夹中的每封电子邮件。你可能在那里有数百万条消息,当消息下载时,客户端会很高兴地让你等上几个小时。

我想做的就是这个。假设您知道收件箱中有多少邮件,而不必下载它们(例如,在IMAP中这很容易),我可以在ListBox中填充占位符项目,并且只有当相应的邮件出现时才能检索到它。

当一组增量项目滚动到视图中时,我如何采取行动?我在研究中遇到了这个选项,但我想要一个解决方案,它(a)允许我增量地识别新可见的消息,而不必在整个集合中迭代(如果可能的话),并且(b)对MVVM友好。

如何确定项目何时滚动到视图中

这比看起来更难——你必须发挥创意。解决这个问题的一种方法是注意到ScrollViewer具有属性ExtentHeightViewportHeightVerticalOffset。您可以使用这些属性来获取当前可见的项目:

  • item height=ExtentHeight/列表框中的项数
  • 视口中第一个项目的索引=垂直偏移/项目高度
  • 视口中的项目数=视口高度/项目高度

现在,只需要使用您喜欢的方法(可能是ListBox子类?)连接到ScrollViewer,并将侦听器附加到其ScrollChanged事件。每次调用处理程序时,都要将视口中的当前项与以前的项进行比较。您可能还想通过跟踪处理程序上次运行的时间来限制它,或者更好的方法是使用Observable.FromEventObservable.Throttle