要实现WPF TreeView的拖动排序功能,可以按照以下步骤进行操作:

  1. 在XAML中定义一个TreeView控件,并为其ItemsSource属性绑定一个可排序的集合。
<TreeView x:Name="treeView" ItemsSource="{Binding Items}">
    <TreeView.ItemTemplate>
        <HierarchicalDataTemplate ItemsSource="{Binding Children}">
            <TextBlock Text="{Binding Name}" />
        </HierarchicalDataTemplate>
    </TreeView.ItemTemplate>
</TreeView>
  1. 在ViewModel中创建一个可排序的集合Items,并初始化并填充数据。同时,创建一个SelectedNode属性用于保存当前选中的节点。
public class ViewModel : INotifyPropertyChanged
{
    private ObservableCollection<Node> items;
    private Node selectedNode;

    public ObservableCollection<Node> Items
    {
        get { return items; }
        set
        {
            items = value;
            OnPropertyChanged(nameof(Items));
        }
    }

    public Node SelectedNode
    {
        get { return selectedNode; }
        set
        {
            selectedNode = value;
            OnPropertyChanged(nameof(SelectedNode));
        }
    }

    // 构造函数中初始化Items集合和其他相关代码...
}
  1. 在MainWindow.xaml.cs的构造函数中,设置DataContext为ViewModel实例,并订阅TreeView的PreviewMouseLeftButtonDown和PreviewMouseMove事件。
public MainWindow()
{
    InitializeComponent();
    DataContext = new ViewModel();
    treeView.PreviewMouseLeftButtonDown += TreeView_PreviewMouseLeftButtonDown;
    treeView.PreviewMouseMove += TreeView_PreviewMouseMove;
}

private Point startPoint;
private bool isDragging;

private void TreeView_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
    startPoint = e.GetPosition(null);
}

private void TreeView_PreviewMouseMove(object sender, MouseEventArgs e)
{
    if (e.LeftButton == MouseButtonState.Pressed && !isDragging)
    {
        Point position = e.GetPosition(null);
        if (Math.Abs(position.X - startPoint.X) > SystemParameters.MinimumHorizontalDragDistance ||
            Math.Abs(position.Y - startPoint.Y) > SystemParameters.MinimumVerticalDragDistance)
        {
            isDragging = true;
            Node selectedItem = (sender as TreeView).SelectedItem as Node;
            DragDrop.DoDragDrop(treeView, selectedItem, DragDropEffects.Move);
        }
    }
}
  1. 在TreeView的PreviewDragOver事件中,设置允许拖放的效果为Move。
private void TreeView_PreviewDragOver(object sender, DragEventArgs e)
{
    if (e.Data.GetDataPresent(typeof(Node)))
    {
        e.Effects = DragDropEffects.Move;
    }
    e.Handled = true;
}
  1. 在TreeView的Drop事件中,处理节点的移动。
private void TreeView_Drop(object sender, DragEventArgs e)
{
    if (e.Data.GetDataPresent(typeof(Node)))
    {
        Node droppedData = e.Data.GetData(typeof(Node)) as Node;
        Node target = ((TreeViewItem)(sender)).DataContext as Node;
        if (droppedData != null && target != null)
        {
            if (droppedData.Parent != target)
            {
                if (droppedData.Parent != null)
                {
                    droppedData.Parent.Children.Remove(droppedData);
                }
                target.Children.Add(droppedData);
                droppedData.Parent = target;
            }
        }
    }
    e.Handled = true;
}
  1. 在TreeView的PreviewDrop事件中,清除拖动效果。
private void TreeView_PreviewDrop(object sender, DragEventArgs e)
{
    if (e.Data.GetDataPresent(typeof(Node)))
    {
        e.Effects = DragDropEffects.None;
    }
    e.Handled = true;
}

通过以上步骤,即可实现WPF TreeView的拖动排序功能。需要注意的是,以上代码仅提供了基本的实现思路,具体的实现细节还需根据实际需求进行调整

WPF TreeView 实现拖动排序

原文地址: https://www.cveoy.top/t/topic/h97Y 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录