【WPF】鼠標拖拽功能DragOver和Drop


在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。不知道這樣理解有沒有錯^_^。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM