2

我正在尝试在 WPF TreeView中实现项目的拖放重新排序,并希望能够在树视图中的项目之间向用户显示一个小括号,以便能够指示项目在放置时的位置操作完成,有点像下面的截图(除了树视图而不是列表视图)

所需效果的屏幕截图

我想我了解拖放在 WPF 中的工作原理,并计划通过处理OnDragOver事件来确定所需位置来实现这一点,但是我不确定我应该如何绘制生成的 carret 效果。

我是否应该在列表视图中我希望删除该项目的位置插入一个虚拟项目(请注意,理想情况下,我不希望列表中的项目明显移动,因此该项目占用的高度必须为 0 ),还是有更简单的方法来达到同样的效果?

4

2 回答 2

2
  1. 您需要抽象 Adorner 类的子类。
  2. 我已经覆盖了 OnRender 来绘制指南/插入符号(一些几何图形没什么特别的线)
  3. 我在 Adorner 上有一个公共属性,DataGrid 在其上绘制装饰器
  4. 具有两个参数的公共方法 SetMousePosition:鼠标悬停的 MouseCoords + DataGridRow。我使用这些数据来确定在 DataRow 上方或下方绘制指南/插入符号的位置,但您在 DataGrid 的可视区域中绘制。我做了一些额外的计算来确定该项目是否需要在之前或之后插入等。

如果您有自定义装饰器,现在可以将其添加到 DataGrid 的装饰器层:

        var adornerLayer = AdornerLayer.GetAdornerLayer(_dataGrid);
        adornerLayer.Add(_dragGuide);

但是,无论出于何种原因,您需要在拖动操作结束后立即将其删除,否则指南/插入符号仍然可见:

var adornerLayer = AdornerLayer.GetAdornerLayer(_dataGrid);
adornerLayer.Remove(_dragGuide);

如果你有这个,那么你可以开始处理所有的例外情况: 在所有列左侧的区域中删除行 在行所在的区域下方删除行。Dropping 不完全可见的行(底部或上部滚动到看不见的地方) 从窗口的不同实例拖放。等等等等

最后,大多数用户并不喜欢辛勤的工作,因为他们不知道可以拖放,或者他们更喜欢使用按钮。

但我希望上面能给你一个启动。

啊,我忘记了这个对我有帮助的链接:MSDN doc: Adorners overview

于 2012-11-21T09:38:09.383 回答
1

我使用装饰器在第三方数据网格中绘制放置指南。我记得很多细节都是为了获得可接受的用户体验。比如拖拽时滚动,有延迟滚动。绘制行的可见宽度的指南也不是微不足道的。最后但并非最不重要的一点是,装饰品有自己的特点。

于 2012-11-20T21:15:12.300 回答