我正在使用一个 Winforms 的 ListBox 作为事件列表,希望将其填充,以便最后一个事件(底部)可见。SelectionMode 设置为 none。用户可以滚动列表,但我希望它一开始就滚动到末尾。
考虑到像 ScrollIntoView、EnsureVisible 这样的支持缺乏,我假设需要创建一个从 ListBox 继承的自定义控件;然而,我不确定接下来该怎么做。
有些提示吗?
TopIndex
属性轻松实现。int visibleItems = listBox.ClientSize.Height / listBox.ItemHeight;
listBox.TopIndex = Math.Max(listBox.Items.Count - visibleItems + 1, 0);
TopIndex
设置为最后一项,而不必担心哪一项实际上应该在顶部,似乎可以很好地工作,例如 listBox.TopIndex = listBox.Items.Count - 1;
。 - Craig W滚动到底部:
listbox.TopIndex = listbox.Items.Count - 1;
滚动到底部并选择最后一个项目:
listbox.SelectedIndex = listbox.Items.Count - 1;
TopIndex
属性(不知道为什么),而且设置SelectedIndex
也不能滚动到所选项。 - MalcolmScroll.ToBottom(listBox);
public partial class Scroll
{
private static ScrollViewer FindViewer(DependencyObject root)
{
var queue = new Queue<DependencyObject>(new[] { root });
do
{
var item = queue.Dequeue();
if (item is ScrollViewer) { return (ScrollViewer)item; }
var count = VisualTreeHelper.GetChildrenCount(item);
for (var i = 0; i < count; i++) { queue.Enqueue(VisualTreeHelper.GetChild(item, i)); }
} while (queue.Count > 0);
return null;
}
public static void ToBottom(ListBox listBox)
{
var scrollViewer = FindViewer(listBox);
if (scrollViewer != null)
{
scrollViewer.ScrollChanged += (o, args) =>
{
if (args.ExtentHeightChange > 0) { scrollViewer.ScrollToBottom(); }
};
}
}
}
int visibleItems = lb.ClientSize.Height / lb.ItemHeight;
if (lb.Items.Count > lb && lb.TopIndex > lb.Items.Count - visibleItems - 2)
lb.TopIndex = lb.Items.Count - visibleItems + 1;
listBox1.SelectedIndex = listBox1.Items.Count - 1;
对你无效吗? - M.BabcockSelectionMode
未设置为None
时,该方法有效。我需要防止在这个特定的列表中选择项目(以避免用户混淆)。 - JYelton