如何以编程方式取消在WPF应用程序之外开始的拖动操作?

时间:2014-01-21 21:46:21

标签: c# wpf treeview drag

我有一个TreeView,其AllowDrop属性设置为false,但在将文件拖过它时仍然显示复制光标。我已经阅读过有关QueryContinueDrag事件的内容,但这似乎只有在拖动对象/窗体上的东西时才触发。我想取消拖动操作,即当用户从应用程序外部(桌面,电子邮件附件等)获取文件并将其带入TreeView时,将光标恢复到正常状态并删除文件。我有什么方法可以做到这一点吗?从我可以看出,QueryContinueDrag是唯​​一一个带有Arg的事件,它允许我将DragAction设置为“取消”,并且在引入外部文件时不会触发。我还考虑强制“esc”按键或鼠标右键单击,但我不想使用PIvoke。

2 个答案:

答案 0 :(得分:1)

@elgonzo是正确的,取消您没有启动的拖放操作不是您的责任。如果尝试,您只需要关心是否打算允许删除数据。通过它的声音,你没有,所以他们将无法丢弃数据。

如果您真的关心光标,那么您可以使用以下内容从PrevieMouseMovePreviewDragOver等事件的多个事件处理程序中更改它:

Mouse.SetCursor(Cursors.No);

尽管如此,您可以将DragEventArgs.Effects属性设置为DragDropEffects.None,这将自动为您设置光标。来自MSDN上的DragEventArgs.Effects Property页:

  

默认情况下,此属性中指定的效果决定了拖放操作目标的鼠标光标。这对于向用户提供关于在删除相应对象时将发生的操作的反馈是有用的。

您可以从以下任何事件中访问DragEventArgs对象:

PreviewDragOverDragOverPreviewDropDropPreviewDragEnterDragEnterPreviewDragLeaveDragLeave

因此,您需要做的就是通过在其中一个处理程序中将DragEventArgs.Effects属性设置为DragDropEffects.None来显示无法删除数据。我推荐其中一个连续的广告,例如PrevieMouseMovePreviewDragOver

答案 1 :(得分:1)

你可以写:

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