我想在WPF中开发一个简单的邮件客户端。在任何邮件客户端中,窗口的一部分是消息列表。桌面客户端(如Outlook或Thunderbird)的常见行为是在设置帐户后立即下载收件箱文件夹中的每封电子邮件。您可能在那里有数百万条消息,客户很乐意让您在下载消息时等待数小时。
我想做的就是这个。鉴于您知道收件箱中有多少邮件而不必下载它们(例如,在IMAP中很容易),我可以使用占位符项填充ListBox,并仅在查看时检索相应的邮件。
如果将一组增量项目滚动到视图中,我该如何采取行动?我在研究中遇到this option,但我想要一个解决方案,(a)允许我逐步识别新的可见消息,而不是迭代整个集合(如果可能的话),和(b) )是MVVM友好的。
答案 0 :(得分:1)
这比它看起来更难 - 你必须要有创意。解决此问题的一种方法是注意ScrollViewer
具有属性ExtentHeight
,ViewportHeight
和VerticalOffset
。您可以使用这些属性来获取当前可见的项目:
现在只需要使用您的首选方法(可能是子类ListBox
)挂钩ScrollViewer,并将侦听器附加到其ScrollChanged
事件。每次调用处理程序时,将视口中的当前项与前一项进行比较。您可能还希望通过使用Observable.FromEvent
和Observable.Throttle
来跟踪上次运行的处理程序,或更好地限制处理程序。