在 Avalonia 中实现 TreeView 节点的拖放

x2b*_*ool 6 .net c# xaml avaloniaui

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

我的 XAML 中有以下代码:

<TreeView Items="{Binding RootFiles}">
   <TreeView.ItemTemplate>
     <TreeDataTemplate ItemsSource="{Binding Files}">
         <TextBlock Text="{Binding Name}"/>
     </TreeDataTemplate>
   </TreeView.ItemTemplate>
</TreeView>
Run Code Online (Sandbox Code Playgroud)

文件管理器

如何使节点可拖动?

kek*_*eks 4

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

我将描述我如何针对您的案例进行类似的改编。

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