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; } }}