gpt4 book ai didi

c# - 拖动和滚动 (WPF)

转载 作者:行者123 更新时间:2023-11-30 17:12:22 25 4
gpt4 key购买 nike

好吧,我一直在为这个问题抓狂,并且花了好几个小时试图研究它是如何工作的,但我还没有找到答案。

基本上我遇到的问题是我的应用程序中有一个文件夹 TreeView ,即:

Catalog

Brands
Nike
Adidas
Lactose


Styles
Sandles
Trainers
Boots

我试图解决的问题是,当我拖动一个文件夹时(这是在我的 DragDropManager 类中处理的),我无法向上或向下滚动(只是显示一个可爱的停止标志)。

如果我想将某些东西从最顶部移动到最底部,这就是一个问题。

滚动本身可以正常工作,无需进行拖动。

如果有人希望看到我的代码的任何部分,请随时询问,因为我不确定实际向你们展示什么。

我已经通读了几篇文章,只是摸不着头脑。

最佳答案

可能有更好的方法,但我所做的是:

  • 在拖动目标元素 (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 中确定当前位置和滚动查看器的增量:

// 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();
}

关于c# - 拖动和滚动 (WPF),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10720050/

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