好吧,伙计们,我一直在为这个问题疯狂地摸不着头脑,花了几个小时试图研究它是如何工作的,但我还没有找到答案。
基本上我遇到的问题是我的应用程序中有一个文件夹树视图,例如:
Catalog
Brands
Nike
Adidas
Lactose
Styles
Sandles
Trainers
Boots
我想解决的问题是,当我拖动文件夹时(这是在我的DragDropManager类中处理的),我无法向上或向下滚动(只显示一个可爱的停止标志)。
如果我想从顶部移动到底部,这是一个问题。
滚动工作正常,无需拖动。
如果有人希望看到我的代码的任何部分随意问,因为我不确定该向您展示什么。
我已经阅读了很多文章,我只是在摸不着头脑。
答案 0 :(得分:2)
可能有更好的方法,但我所做的是:
在目标元素(QueryContinueDrag)上拖动时,检查您所在的控件是否在其可视树中具有滚动查看器。
现在检查您是否靠近滚动查看器的边缘,例如10px远。
滚动滚动查看器
以下是一些代码:
查找相关的ScrollViewer:
var _scrollViewerControl = FindVisualChild<ScrollViewer>(treeView);
private childItem FindVisualChild<childItem>(DependencyObject obj)
where childItem : DependencyObject
{
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;
}
在QueryContinueDrag中,确定当前位置和delta到scrollviewer:
// as we don't have eventargs here exposing the current mouse position we use the
// win32 API to get the current mouse position
Win32.POINT p;
if (!Win32.GetCursorPos(out p))
{
return;
}
//this is the point on the screen
Point point = new Point(p.X, p.Y);
//get position relative to scrollViewerControl
Point controlPoint = _scrollViewerControl.PointFromScreen(point);
if (controlPoint.Y < 10 && -10 < controlPoint.Y)
{
_scrollViewerControl.LineUp();
}
else if (controlPoint.Y > _scrollViewerControl.ViewportHeight - 10 && _scrollViewerControl.ViewportHeight + 10 > controlPoint.Y)
{
_scrollViewerControl.LineDown();
}
if (controlPoint.X < 10 && -10 < controlPoint.X)
{
_scrollViewerControl.LineLeft();
}
else if (controlPoint.X > _scrollViewerControl.ViewportWidth - 10 && _scrollViewerControl.ViewportWidth + 10 > controlPoint.X)
{
_scrollViewerControl.LineRight();
}