滚动条移动时停止刷新列表框

Stop refresh listBox when scrollbar is moving

是否可以在松开鼠标左键后才停止滚动刷新ListBox内容?

您需要通过设置附加的 属性 ScrollViewer.IsDeferredScrolling:

来配置 ListBoxScrollViewer 以延迟内容呈现
<ListBox ScrollViewer.IsDeferredScrolling="True"  />

以下示例仅在ScrollViewer.CanContentScroll=true时有效。如果 ScrollViewer.CanContentScroll=false,那么 ScrollViewer.VerticalOffset 将不会 return 项目索引,而是项目的位置偏移量(以像素为单位)。在这种情况下,您必须根据项目位置找到第一个可见项目。

ScrollViewer.ScrollChanged 事件中获取第一个可见项的示例,当 ScrollViewer.CanContentScroll=true 时(默认为 ListBoxListView):

<ListBox ScrollViewer.IsDeferredScrolling="True"   
         ScrollViewer.ScrollChanged="OnScrollChanged" />

private void OnScrollChanged(object sender, ScrollChangedEventArgs e)
{
  var listBox = sender as System.Windows.Controls.ListBox;

  var firstVisibleItem = listBox.Items[(int) e.VerticalOffset];
}

请注意,ScrollViewer.ScrollChanged 在每次索引更改时或 IsDeferredScrolling=True 仅在释放滚动条并完成滚动后引发。