在 Avalonia 中为 TreeView 节点实现拖放
Implementing drag and drop for TreeView nodes in Avalonia
如何在TreeView 控件中实现拖放行为?一个例子是文件资源管理器,用户可以通过拖动将文件从一个文件夹移动到另一个文件夹。
我的 XAML 中有以下代码:
<TreeView Items="{Binding RootFiles}">
<TreeView.ItemTemplate>
<TreeDataTemplate ItemsSource="{Binding Files}">
<TextBlock Text="{Binding Name}"/>
</TreeDataTemplate>
</TreeView.ItemTemplate>
</TreeView>
如何使节点可拖动?
不幸的是,我们还没有适当的拖放支持,因此您必须手动实现它。
我将描述我如何针对您的案例进行类似的改编。
您可以在 TreeView 控件级别处理鼠标事件。当 MouseDown
触发时,您需要检查 PointerOverElement
属性 以检测鼠标当前是否在树的一个节点内(使用 Parent 属性 遍历树或简单地检查 DataContext),如果是,则需要将所述节点保存在某处。
当按下其中一个鼠标按钮时触发 MouseMove
事件时,您需要捕获鼠标,此时您的代码处于 "drag" 状态。您可以更改 TreeView 的 Cursor
属性 以向用户提供一些反馈
当MouseUp
被触发时,您需要检测光标相对于其他节点的位置,并相应地更改模型支持TreeView。
如何在TreeView 控件中实现拖放行为?一个例子是文件资源管理器,用户可以通过拖动将文件从一个文件夹移动到另一个文件夹。
我的 XAML 中有以下代码:
<TreeView Items="{Binding RootFiles}">
<TreeView.ItemTemplate>
<TreeDataTemplate ItemsSource="{Binding Files}">
<TextBlock Text="{Binding Name}"/>
</TreeDataTemplate>
</TreeView.ItemTemplate>
</TreeView>
如何使节点可拖动?
不幸的是,我们还没有适当的拖放支持,因此您必须手动实现它。
我将描述我如何针对您的案例进行类似的改编。
您可以在 TreeView 控件级别处理鼠标事件。当 MouseDown
触发时,您需要检查 PointerOverElement
属性 以检测鼠标当前是否在树的一个节点内(使用 Parent 属性 遍历树或简单地检查 DataContext),如果是,则需要将所述节点保存在某处。
当按下其中一个鼠标按钮时触发 MouseMove
事件时,您需要捕获鼠标,此时您的代码处于 "drag" 状态。您可以更改 TreeView 的 Cursor
属性 以向用户提供一些反馈
当MouseUp
被触发时,您需要检测光标相对于其他节点的位置,并相应地更改模型支持TreeView。