wpf ListBox拖动排序实现

时间:2021-07-05 15:47:21

XAML:

<Window x:Class="WpfApplication6.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<Grid>
<ListBox Name="LBoxSort" PreviewMouseMove="LBoxSort_OnPreviewMouseMove" Drop="LBoxSort_OnDrop" AllowDrop="True">
<TextBox Text="1111"/>
<TextBlock Text="2222"/>
<TextBlock Text="3333"/>
<TextBlock Text="4444"/>
<TextBlock Text="5555"/>
</ListBox>
</Grid>
</Window>

using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Windows;using System.Windows.Controls;using System.Windows.Data;using System.Windows.Documents;using System.Windows.Input;using System.Windows.Media;using System.Windows.Media.Imaging;using System.Windows.Navigation;using System.Windows.Shapes;namespace WpfApplication6{    /// <summary>    /// MainWindow.xaml 的交互逻辑    /// </summary>    public partial class MainWindow : Window    {        public MainWindow()        {            InitializeComponent();        }        private void LBoxSort_OnPreviewMouseMove(object sender, MouseEventArgs e)        {            if (e.LeftButton == MouseButtonState.Pressed)            {                var pos = e.GetPosition(LBoxSort);                HitTestResult result = VisualTreeHelper.HitTest(LBoxSort, pos);                if (result == null)                {                    return;                }                var listBoxItem = Utils.FindVisualParent<ListBoxItem>(result.VisualHit);                if (listBoxItem == null || listBoxItem.Content != LBoxSort.SelectedItem)                {                    return;                }                DataObject dataObj = new DataObject(listBoxItem.Content as TextBlock);                DragDrop.DoDragDrop(LBoxSort, dataObj, DragDropEffects.Move);            }        }        private void LBoxSort_OnDrop(object sender, DragEventArgs e)        {            var pos = e.GetPosition(LBoxSort);            var result = VisualTreeHelper.HitTest(LBoxSort, pos);            if (result == null)            {                return;            }            //查找元数据            var sourcePerson = e.Data.GetData(typeof(TextBlock)) as TextBlock;            if (sourcePerson == null)            {                return;            }            //查找目标数据            var listBoxItem = Utils.FindVisualParent<ListBoxItem>(result.VisualHit);            if (listBoxItem == null)            {                return;            }            var targetPerson = listBoxItem.Content as TextBlock;            if (ReferenceEquals(targetPerson, sourcePerson))            {                return;            }            LBoxSort.Items.Remove(sourcePerson);            LBoxSort.Items.Insert(LBoxSort.Items.IndexOf(targetPerson), sourcePerson);        }    }    internal static class Utils    {        //根据子元素查找父元素        public static T FindVisualParent<T>(DependencyObject obj) where T : class        {            while (obj != null)            {                if (obj is T)                    return obj as T;                obj = VisualTreeHelper.GetParent(obj);            }            return null;        }    }}