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