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

时间:2014-04-16 18:27:44

标签: c# wpf email mvvm

我想在WPF中开发一个简单的邮件客户端。在任何邮件客户端中,窗口的一部分是消息列表。桌面客户端(如Outlook或Thunderbird)的常见行为是在设置帐户后立即下载收件箱文件夹中的每封电子邮件。您可能在那里有数百万条消息,客户很乐意让您在下载消息时等待数小时。

我想做的就是这个。鉴于您知道收件箱中有多少邮件而不必下载它们(例如,在IMAP中很容易),我可以使用占位符项填充ListBox,并仅在查看时检索相应的邮件。

如果将一组增量项目滚动到视图中,我该如何采取行动?我在研究中遇到this option,但我想要一个解决方案,(a)允许我逐步识别新的可见消息,而不是迭代整个集合(如果可能的话),和(b) )是MVVM友好的。

1 个答案:

答案 0 :(得分:1)

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

  • item height = ExtentHeight / ListBox中的项目数
  • 视口中第一项的索引= VerticalOffset / item height
  • 视口中的项目数= ViewportHeight /项目高度

现在只需要使用您的首选方法(可能是子类ListBox)挂钩ScrollViewer,并将侦听器附加到其ScrollChanged事件。每次调用处理程序时,将视口中的当前项与前一项进行比较。您可能还希望通过使用Observable.FromEventObservable.Throttle来跟踪上次运行的处理程序,或更好地限制处理程序。