在Winform里面實現拖入功能只要設置控件AllowDrop=true;
然后實現方法
//拖入 private void txtInputPath_DragOver(object sender, DragEventArgs e) { e.Effects = DragDropEffects.Link; } //拖放結束 private void txtInputPath_Drop(object sender, DragEventArgs e) { string[] data = (string[])e.Data.GetData(DataFormats.FileDrop); if (data == null || data.Length < 1 || !data[0].ToLower().EndsWith(".txt")) return; txtInputPath.Text = data[0]; }
但是,再WPF里面用同樣的方法就是不行,實現不了。經過百度后發現,不能使用DrapOver,改為PreviewDragOver就可以了。所以代碼修改為:
/// <summary> /// 拖入 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void txtInputPath_PreviewDragOver(object sender, DragEventArgs e) { e.Effects = DragDropEffects.Link; e.Handled = true;//必須加 } /// <summary> /// 拖放結束 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void txtInputPath_PreviewDrop(object sender, DragEventArgs e) { string[] data = (string[])e.Data.GetData(DataFormats.FileDrop); if (data == null || data.Length < 1 || !data[0].ToLower().EndsWith(".txt")) return; txtInputPath.Text = data[0]; }
經過測試,確實就可以了。那么問題來了,為什么Winform里面可以,WPF里面不可以呢。查了下,可能是事件的機制及觸發時間不一樣吧。
以下是找到的一段翻譯是這么說的:
Drag-and-drop操作過程中,會由一系列事件,DragSource包含的Event包括,GiveFeedback、QueryContinueDrag、PreviewGiveFeedback 和 PreviewQueryContinueDrag;DragTarget包含的Event包括:DragEnter[dragged object 進入這個target的邊界時],DragLeave[dragged object 離開garget的邊界之外],DragOver[dragged object 在target范圍內移動],Drop[dragged object 被放置到target內],PreviewDragEnter,PreviewDragLeave,PreviewDragOver,PreviewDrop。
這些Event有兩種模型,一個是Bubbling,一個是Tunnelling(帶Preview前綴的)。
Bubbling的event是動作發生后觸發;Tunnelling的event是動作發生前觸發。
那么是不是可以這么理解DragOver里面代碼是設置鏈接方式,但是觸發時間點是發生后才觸發這個事件,那么這個時候修改e.Effects = DragDropEffects.Link;可能為時已晚,所以要使用PreviewDragOver。不知道這樣理解有沒有錯^_^。
