WPF TreeView 实现拖动排序
要实现WPF TreeView的拖动排序功能,可以按照以下步骤进行操作:
- 在XAML中定义一个TreeView控件,并为其ItemsSource属性绑定一个可排序的集合。
<TreeView x:Name="treeView" ItemsSource="{Binding Items}">
<TreeView.ItemTemplate>
<HierarchicalDataTemplate ItemsSource="{Binding Children}">
<TextBlock Text="{Binding Name}" />
</HierarchicalDataTemplate>
</TreeView.ItemTemplate>
</TreeView>
- 在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集合和其他相关代码...
}
- 在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);
}
}
}
- 在TreeView的PreviewDragOver事件中,设置允许拖放的效果为Move。
private void TreeView_PreviewDragOver(object sender, DragEventArgs e)
{
if (e.Data.GetDataPresent(typeof(Node)))
{
e.Effects = DragDropEffects.Move;
}
e.Handled = true;
}
- 在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;
}
- 在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的拖动排序功能。需要注意的是,以上代码仅提供了基本的实现思路,具体的实现细节还需根据实际需求进行调整
原文地址: https://www.cveoy.top/t/topic/h97Y 著作权归作者所有。请勿转载和采集!