<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">
<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;
转载于:https://blog.csdn.net/linraise/article/details/51107252#