wpf - 在 ListView 中的项目之间绘制插入符号

标签 wpf drag-and-drop treeview

我正在尝试在 WPF 中实现项目的拖放重新排序 TreeView并希望能够在 TreeView 中的项目之间向用户显示一个插入符,以便能够指示放置操作完成时项目的位置,有点像下面的屏幕截图(除了 TreeView ) ListView )

screenshot of the desired effect

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

我是否应该在 ListView 中我希望放置项目的位置插入一个虚拟项目(请注意,理想情况下我不希望列表中的项目明显移动,因此该项目占用的高度会以某种方式为0),或者有没有更简单的方法来达到相同的效果?

最佳答案

  1. 您需要抽象 Adorner 类的子类。
  2. 我已经重写了 OnRender 来绘制引导线/插入符(一 strip 有一些几何形状的线,没什么特别的)
  3. 我在装饰器 DataGrid 上有一个公共(public)属性,可以在其上绘制装饰器
  4. 具有两个参数的公共(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/

相关文章:

silverlight - ItemSource 更改时在 TreeView 中展开 Root

c# - 以编程方式单击 WPF 按钮

wpf - 连接 CollectionChanged 和 PropertyChanged (或 : Why do some WPF Bindings not refresh? )

c# - 在 WPF 中显示 BitmapSource 不起作用

javascript - 如何在文本输入中添加拖放区域?

c# - 通过属性设置 Treeview HierarchicalDataTemplate

javascript - 文件夹的工具提示

c# - MVVM WPF : Change property of item by name from ViewModel

javascript - 可排序列表+查找删除索引

jquery - Rails 3.1 可排序嵌套集,带有 jquery 和两个模型