<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"/>
<TextBlock Text="2222"/>
<TextBlock Text="3333"/>
<TextBlock Text="4444"/>
<TextBlock Text="5555"/>
<TextBlock Text="2222"/>
<TextBlock Text="3333"/>
<TextBlock Text="4444"/>
<TextBlock Text="5555"/>
<TextBlock Text="2222"/>
<TextBlock Text="3333"/>
<TextBlock Text="4444"/>
<TextBlock Text="5555"/>
<TextBlock Text="2222"/>
<TextBlock Text="3333"/>
<TextBlock Text="4444"/>
<TextBlock Text="5555"/>
</ListBox>
</Grid>
public partial class ListBoxIsDrag : UserControl
{
public ListBoxIsDrag()
{
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;
}
}