在這裏你確實有一個複雜的場景,所以這將從基本開始,希望能給你一個方向並希望有一個解決方案。
如果控件標記爲AllowDrop = true,框架將只會通知DragEnter事件。所以確保你已經做到了。這聽起來像你,但我只是想確定。
我不知道爲什麼你需要DragLeave事件,但如果它是抓住選定的數據,獲取數據的最簡單方法是不掛鉤到DragLeave中,而是掛接到PreviewMouseMove中。然後,您可以確定是否按下鼠標,並在確定DoDragDrop之前移動多少距離。
在這種情況下,您還可以添加和分析拖動數據。當拖動開始,你可以創建一個新的數據對象,並與的DoDragDrop調用發送:
private static void listBox_PreviewMouseMove(object sender, MouseEventArgs e)
{
// Get the current mouse position
var mousePos = e.GetPosition(null);
var diff = startPoint - mousePos;
if (canScroll && e.LeftButton == MouseButtonState.Pressed &&
(Math.Abs(diff.X) > SystemParameters.MinimumHorizontalDragDistance ||
Math.Abs(diff.Y) > SystemParameters.MinimumVerticalDragDistance))
{
var dataObject = (from lbi in startList.Items.Cast<object>().Select((t, i) => (ListBoxItem)startList.ItemContainerGenerator.ContainerFromIndex(i)) where lbi != null && lbi.IsSelected select Convert.ToString(lbi.Content)).ToList();
// Initialize the drag & drop operation
var listBoxData = new ListBoxData(){ StartList = startList, Data = dataObject};
var dragData = new DataObject("listBoxData", listBoxData);
System.Windows.DragDrop.DoDragDrop(startList, dragData, DragDropEffects.Move);
}
}
這拖拽數據是通過DragEventArgs目的是通過使用(如果不重命名事件參數現在訪問,它的電子商務):
e.Data.GetData("listBoxData")
我的建議是添加一些獨特的信息拖動事件數據來區分基於數據的事件。您可以選擇列表框中的數據項目,也可以選擇保存數據項目的新類別以及其他指標。
有一個相關的問題在http://stackoverflow.com/questions/5447301/wpf-drag-drop-when-does-dragleave-fire;我希望有更好的解決方案。 – naviwhack