2014-01-21 44 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; 
} 
相关问题