2014-01-21 43 views
0

我有一個TreeView的AllowDrop屬性設置爲false,但仍然顯示覆制光標時拖動文件。我已經閱讀了關於QueryContinueDrag事件的消息,但是這似乎只在將對象/表單/任何東西拖動時纔會觸發。當用戶從應用程序外部(桌面,電子郵件附件等)接收文件並將其帶入TreeView時,我想要取消拖動操作,即將光標恢復到正常並放棄文件。有什麼方法可以做到這一點?從我所知道的情況來看,QueryContinueDrag是Arg的唯一事件,它允許我將DragAction設置爲「取消」,並且在引入外部文件時不會觸發。我也考慮強制「esc」按鍵或鼠標右鍵單擊,但我不想使用PIvoke。如何以編程方式取消在WPF應用程序之外開始的拖動操作?

+2

如果我想拖放從我的屏幕左側東西,我的屏幕的右邊,我只是移動鼠標越過你的應用程序的窗口(您應用恰好碰巧坐在...)。我想繼續拖動(從而再次離開你的窗口),直到我到達我的屏幕右側的目的地。你有沒有想過如果你的應用程序開始搞亂它應該不被關注的操作,我會反應如何? – elgonzo

回答

1

@elgonzo是正確的,它是不是你的責任,取消你沒有開始的拖放操作。你只需要關心你是否打算允許數據被刪除,如果它被嘗試。通過它的聲音,你不會,所以他們將無法刪除數據。

如果你真的關心光標,那麼你可以使用這個改變,從像PrevieMouseMovePreviewDragOver事件幾個事件處理程序:

Mouse.SetCursor(Cursors.No); 

爲了您的信息,雖然,你可以設置DragEventArgs.Effects屬性到DragDropEffects.None它會自動爲你設置光標。從MSDN上的DragEventArgs.Effects Property頁面:

默認情況下,此屬性中指定的效果決定了拖放操作目標的鼠標光標。這對於在相應的對象被刪除時將發生的操作向用戶提供反饋很有用。

PreviewDragOverDragOverPreviewDropDropPreviewDragEnterDragEnterPreviewDragLeaveDragLeave

因此,所有你需要做的是:

您可以從以下任一事件的訪問DragEventArgs對象通過在其中一個處理程序中將DragEventArgs.Effects屬性設置爲DragDropEffects.None,可以顯示無法刪除數據。我會推薦一個連續的例如PrevieMouseMovePreviewDragOver

1

你可以寫:

if (condition) { 
     `e.Handled = true; 
     ((Thumb)e.OriginalSource).CancelDrag(); 
     return; 
} 
相關問題