我有一个列表框,我会动态地将项目添加到列表框中。
我希望列表框自动滚动到最后添加的项目。
我用过
List<string> ItemsList = new List<string>
public void InsertItem(string newItem)
{
ItemsList.Add(status);
if (ItemsList.Count > MaxSize)
{
ItemsList.RemoveAt(0);
}
lb.Items.Refresh();
lb.SelectedIndex = lb.Items.Count - 1;
lb.ScrollIntoView(status);
}
但这仅在我的应用程序初始化之前有效(即我在应用程序启动之前添加了一些项目)
但是,如果我尝试添加项目,应用程序启动后,滚动条不会自动滚动到最后添加的项目
任何人都可以告诉这个
的解决方案答案 0 :(得分:2)
实际上,这实际上是一项使命,因为ScrollIntoView仅在第一次调用时才起作用。之后的所有其他电话都不会出于某种原因。
解决这个问题的方法是找到&#34; ScrollInfo&#34;列表框并设置滚动值。见下面的例子
public static void AutoScrollToCurrentItem(ListBox listBox, int index)
{
// Find a container
UIElement container = null;
for (int i = index; i > 0; i--)
{
container = listBox.ItemContainerGenerator.ContainerFromIndex(i) as UIElement;
if (container != null)
{
break;
}
}
if (container == null)
return;
// Find the ScrollContentPresenter
ScrollContentPresenter presenter = null;
for (Visual vis = container; vis != null && vis != listBox; vis = VisualTreeHelper.GetParent(vis) as Visual)
if ((presenter = vis as ScrollContentPresenter) != null)
break;
if (presenter == null)
return;
// Find the IScrollInfo
var scrollInfo =
!presenter.CanContentScroll ? presenter :
presenter.Content as IScrollInfo ??
FirstVisualChild(presenter.Content as ItemsPresenter) as IScrollInfo ??
presenter;
// Find the amount of items that is "Visible" in the ListBox
var height = (container as ListBoxItem).ActualHeight;
var lbHeight = listBox.ActualHeight;
var showCount = (int)(lbHeight / height) - 1;
//Set the scrollbar
if (scrollInfo.CanVerticallyScroll)
scrollInfo.SetVerticalOffset(index - showCount);
}
private static DependencyObject FirstVisualChild(Visual visual)
{
if (visual == null) return null;
if (VisualTreeHelper.GetChildrenCount(visual) == 0) return null;
return VisualTreeHelper.GetChild(visual, 0);
}
使用上述代码的方法可以是这样的:
private void Button_Click(object sender, RoutedEventArgs e)
{
listBox1.Items.Add("New Item");
AutoScrollToCurrentItem(listBox1, listBox1.Items.Count);
}
答案 1 :(得分:0)
我真的希望我有足够的分数来评论你的问题。您的ItemsList如何连接到ListBox?启动应用程序后,您可以手动向下滚动到新项目吗?
您很可能将ItemsList绑定到ListBox。如果是这样,我建议您将List<string>
更改为ObservableCollection<string>
,以便ListBox可以自动更新。
答案 2 :(得分:0)
如果你可以自动更新列表框,那么使用ObservableCollection。
private ObservableCollection<string> _source = new ObservableCollection<string>();
和你的插入方法:
private void Insert(string item)
{
_source.Add(item);
lb.SelectedIndex = _source.Count - 1;
lb.ScrollIntoView(ListBox.SelectedItem);
}