WPF使用GongSolutions.WPF.DragDrop库实现ListBox通过鼠标拖拽调整顺序,拖拽结束后的事件总结

如题,GongSolutions.WPF.DragDrop库很强大,可以帮助我们更容易的实现ListBoxItem拖拽调整顺序的需求。

首先通过nuget添加库的引用

然后在xaml中添加:

xmlns:dd="clr-namespace:GongSolutions.Wpf.DragDrop;assembly=GongSolutions.Wpf.DragDrop"
......
<ListBox FontSize="16" ItemsSource="{Binding ElementName=ucBarCodeSetting, Path=BarCodeSet.CodeUnits}" Margin="10,0" BorderBrush="LightGray" BorderThickness="1,0,1,1" Style="{StaticResource BaseStyle}"
     SelectionMode="Extended"
     ItemsPanel="{StaticResource panelTemplate}"
     ItemContainerStyle="{StaticResource itemContainerStyle}"
     dd:DragDrop.IsDragSource="True"
     dd:DragDrop.IsDropTarget="True"
     dd:DragDrop.UseDefaultEffectDataTemplate="True"
     dd:DragDrop.DropHandler="{Binding ElementName=ucBarCodeSetting}">

重点:

dd:DragDrop.IsDragSource="True"
dd:DragDrop.IsDropTarget="True"
dd:DragDrop.DropHandler="{Binding ElementName=ucBarCodeSetting}"

这里有两个事件:DropHandler和DragHandler,需要实现的接口分别是:IDropTarget和IDragSource,注意区分。

public partial class BarCodeSetting : UserControl, INotifyPropertyChanged, IDropTarget
{
void IDropTarget.DragOver(IDropInfo dropInfo)
{
    var sourceItem = dropInfo.Data as BarCodeUnit;
    var targetItem = dropInfo.TargetItem as BarCodeUnit;

    if (sourceItem != null && targetItem != null)// && targetItem.CanAcceptChildren)
    {
        dropInfo.DropTargetAdorner = DropTargetAdorners.Insert;
        dropInfo.Effects = DragDropEffects.Move;
    }
}

void IDropTarget.Drop(IDropInfo dropInfo)
{
    var sourceItem = (BarCodeUnit)dropInfo.Data;
    var targetIndex = dropInfo.InsertIndex > 0 ? dropInfo.InsertIndex - 1 : 0;
    Console.WriteLine(targetIndex.ToString());

    BarCodeSet.CodeUnits.Remove(sourceItem);
    BarCodeSet.CodeUnits.Insert(targetIndex, sourceItem);
    rebuildIds();
}
}

 

 

posted on 2025-08-29 14:08  lopengye  阅读(71)  评论(0)    收藏  举报

导航