在 Avalonia 中实现 TreeView 节点的拖放

Posted

技术标签:

【中文标题】在 Avalonia 中实现 TreeView 节点的拖放【英文标题】:Implementing drag and drop for TreeView nodes in Avalonia 【发布时间】:2017-11-10 13:03:56 【问题描述】:

如何在TreeView控件中实现拖放行为?一个例子是文件浏览器,用户可以通过拖动将文件从一个文件夹移动到另一个文件夹。

我的 XAML 中有以下代码:

<TreeView Items="Binding RootFiles">
   <TreeView.ItemTemplate>
     <TreeDataTemplate ItemsSource="Binding Files">
         <TextBlock Text="Binding Name"/>
     </TreeDataTemplate>
   </TreeView.ItemTemplate>
</TreeView>

如何使节点可拖动?

【问题讨论】:

【参考方案1】:

很遗憾,我们还没有适当的拖放支持,因此您必须手动实现它。

我将描述我是如何为你的案例做了类似的改编的。

您可以在 TreeView 控件级别处理鼠标事件。当MouseDown触发时,你需要检查PointerOverElement属性来检测鼠标当前是否在树的某个节点内(使用Parent属性遍历树或简单地检查DataContext),如果是,你需要保存在某处说节点。 当按下鼠标按钮之一时触发MouseMove 事件时,您需要捕获鼠标,此时您的代码处于“拖动”状态。您可以更改 TreeView 的 Cursor 属性以向用户提供一些反馈 当MouseUp被触发时,需要检测光标相对于其他节点的位置,并在支持TreeView的模型中做出相应的改变。

【讨论】:

以上是关于在 Avalonia 中实现 TreeView 节点的拖放的主要内容,如果未能解决你的问题,请参考以下文章

WPF treeview:如何在资源管理器中实现键盘导航?

Avalonia 中的 GetTemplateChild / TemplatePart?

在Windows 10应用程序中实现树视图

WinForm控件TreeView 只部分节点显示 CheckBox

怎样实现TreeView的TreeNode拖动功能,以调整TreeNode的顺序?(C#)

Unity Shaders and Effects Cookbook (7-2) Surface Shader 中实现 顶点动画