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(); } }
浙公网安备 33010602011771号