我有一个.NET 3.5 WinForm,其中包含一个以详细模式显示的ListView。它作为长时间后台任务上状态项目的可滚动列表。我将最新的ListViewItem(状态条目)添加到底部。为了确保它被看到,我在添加后确保新项目的可见性。这一切都很好;列表视图自动滚动到底部以显示最新的项目。
private void AddListItem(DateTime timestamp, string message, int index)
{
var listItem = new ListViewItem(timestamp.ToString());
listItem.SubItems.Add(message);
statusList.Items.Insert(index, listItem);
statusList.Items[statusList.Items.Count - 1].EnsureVisible();
}
问题是,如果用户向上滚动查看旧消息,则ListView将向下滚动以使新项目可见。有没有一种方法可以控制此行为,以检查用户是否与滚动条进行交互(特别是如果他们在滚动条上按住鼠标按钮)?如果始终在底部,则可能也可以检测滚动条是否在底部。如果不在底部,则我将不会确保最新项目的可见性。类似于:
private void AddListItem(DateTime timestamp, string message, int index)
{
var listItem = new ListViewItem(timestamp.ToString());
listItem.SubItems.Add(message);
statusList.Items.Insert(index, listItem);
if (!statusList.IsScrollbarUserControlled)
{
statusList.Items[statusList.Items.Count - 1].EnsureVisible();
}
}
奇怪的是,当用户按住滚动条的“手柄”时,手柄不会移动(暗示视图实际上并没有通过程序滚动下来),但事实上确实滚动了。
更新: 是否有可能检测滚动条的位置,即是否在底部?