gpt4 book ai didi

c# - WPF 列表框在拖动时自动滚动

转载 作者:IT王子 更新时间:2023-10-29 04:18:34 25 4
gpt4 key购买 nike

我有一个 WPF 应用程序,它有一个 ListBox。拖动机制已经实现了,但是当列表太长,我想把一个项目移动到一个不可见的位置时,我做不到。

例如,屏幕显示 10 个项目。我有 20 件元素。如果我想将最后一个项目拖到第一个位置,我必须拖到顶部然后放下。向上滚动并再次拖动。

如何使 ListBox 自动滚动?

最佳答案

明白了。使用ListBox的事件DragOver,使用找到的函数here获取列表框的 scrollviewer 之后,只需稍微调整一下 Position。

private void ItemsList_DragOver(object sender, System.Windows.DragEventArgs e)
{
ListBox li = sender as ListBox;
ScrollViewer sv = FindVisualChild<ScrollViewer>(ItemsList);

double tolerance = 10;
double verticalPos = e.GetPosition(li).Y;
double offset = 3;

if (verticalPos < tolerance) // Top of visible list?
{
sv.ScrollToVerticalOffset(sv.VerticalOffset - offset); //Scroll up.
}
else if (verticalPos > li.ActualHeight - tolerance) //Bottom of visible list?
{
sv.ScrollToVerticalOffset(sv.VerticalOffset + offset); //Scroll down.
}
}

public static childItem FindVisualChild<childItem>(DependencyObject obj) where childItem : DependencyObject
{
// Search immediate children first (breadth-first)
for (int i = 0; i < VisualTreeHelper.GetChildrenCount(obj); i++)
{
DependencyObject child = VisualTreeHelper.GetChild(obj, i);

if (child != null && child is childItem)
return (childItem)child;

else
{
childItem childOfChild = FindVisualChild<childItem>(child);

if (childOfChild != null)
return childOfChild;
}
}

return null;
}

关于c# - WPF 列表框在拖动时自动滚动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1316251/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com