我正在尝试在 WPF 中实现项目的拖放重新排序 TreeView并希望能够在 TreeView 中的项目之间向用户显示一个插入符,以便能够指示放置操作完成时项目的位置,有点像下面的屏幕截图(除了 TreeView ) ListView )
我想我了解拖放在 WPF 中的工作原理,并计划通过处理 OnDragOver
事件来确定所需的位置来实现这一点,但我不确定应该如何绘制结果卡雷特效应。
我是否应该在 ListView 中我希望放置项目的位置插入一个虚拟项目(请注意,理想情况下我不希望列表中的项目明显移动,因此该项目占用的高度会以某种方式为0),或者有没有更简单的方法来达到相同的效果?
最佳答案
- 您需要抽象 Adorner 类的子类。
- 我已经重写了 OnRender 来绘制引导线/插入符(一 strip 有一些几何形状的线,没什么特别的)
- 我在装饰器 DataGrid 上有一个公共(public)属性,可以在其上绘制装饰器
- 具有两个参数的公共(public)方法 SetMousePosition:鼠标悬停在其上的 MouseCoords + DataGridRow。我使用这些数据来确定在 DataRow 上方或下方绘制引用线/插入符的位置,但您在 DataGrid 的可视区域中绘制。我做了一些额外的计算来确定该项目是否需要插入之前或之后等。
如果您有自定义装饰器,现在可以将其添加到 DataGrid 的装饰器层:
var adornerLayer = AdornerLayer.GetAdornerLayer(_dataGrid);
adornerLayer.Add(_dragGuide);
但是,无论出于何种原因,您都需要在拖动操作结束后立即将其删除,否则指南/插入符仍然可见:
var adornerLayer = AdornerLayer.GetAdornerLayer(_dataGrid);
adornerLayer.Remove(_dragGuide);
如果你有这个,那么你可以开始处理所有异常情况: 在所有列左侧的区域中删除行 将行放置在行所在区域下方。 删除不完全可见的行(底部或上部滚动到视线之外) 从窗口的不同实例拖放。 等等等等
最终,大多数用户并不享受这项艰苦的工作,因为他们不知道可以拖放,或者更喜欢使用按钮。
但我希望以上内容能给您带来启发。
啊我忘记了这个对我有帮助的链接:MSDN doc: Adorners overview
关于wpf - 在 ListView 中的项目之间绘制插入符号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13477738/